我有一个ruby脚本使用dbi gem重复执行以下INSERT语句:
sql = "INSERT INTO traffic_by_pages (publication_id, subdomain, region_id, region_name, page_url, site_section, yr, mnth, dy, TrafficDate, DailyVisitors, DailyVisits, DailyPageViews, NewVisitors, ReturningVisitors, object_id, object_type) VALUES (#{publication_id}, '#{subdomain}', #{region_id}, '#{region_name}', '#{page_url}', '#{site_section}', #{yr}, #{mnth}, #{dy}, '#{trafficdate}', #{dailyvisitors}, #{dailyvisits}, #{dailypageviews}, #{newvisitors}, #{returningvisitors}, #{obj_id}, '#{objectType}');"
此脚本在几天前运行良好,出现以下错误:
您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在'''''附近使用正确的语法。
错误似乎是从在插入的表上添加了object_id和object_type的索引开始的。我得出了这个结论,因为如果我没有为object_id插入一个值,那么该语句就会神奇地起作用。另外,我从表格的开发版本中取出了索引,并且oila!它再次起作用。我需要保留这个索引。
有没有人处理过这个问题?我即将使用活动记录重写脚本。整个脚本将数据从MS SQL Server数据库和INSERTS拉入MySQL数据库。
我还应该在Ruby编程中添加我真的不知道我在做什么,而且我不确定这个脚本是如何最终用Ruby编写的。任何帮助将非常感激。谢谢!
答案 0 :(得分:1)
这听起来像是一个引用问题。仔细查看错误消息:
' '')'
您将获得一个空格,后跟一个空字符串文字,后跟SQL中的右括号。您添加了object_id
和object_type
列,但所有内容都已损坏,因此问题可能在object_type
值中。
您不应该使用字符串插值来构建SQL语句,您应该使用占位符。其中一种方法可能有所帮助:
sql = 'INSERT INTO traffic_by_pages (publication_id, subdomain, region_id, region_name, page_url, site_section, yr, mnth, dy, TrafficDate, DailyVisitors, DailyVisits, DailyPageViews, NewVisitors, ReturningVisitors, object_id, object_type) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
# For each row...
dbh.do(sql,
publication_id,
subdomain,
region_id,
region_name,
page_url,
site_section,
yr,
mnth,
dy,
trafficdate,
dailyvisitors,
dailyvisits,
dailypageviews,
newvisitors,
returningvisitors,
obj_id,
objectType
)
# or
sth = dbh.prepare(sql)
# for each row...
sth.execute(publication_id, subdomain, region_id, ...)
启动和停止工作很奇怪,但这可能只是调试工作的副作用。