mysql - 使用 dbi gem 的 ruby​​ 脚本在带有新索引的 mysql 表中插入错误

标签 mysql ruby rubygems dbi

我有一个 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}');"

此脚本在几天前运行良好,但出现以下错误:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' '')'.

错误似乎是从在要插入的表的 object_id 和 object_type 上添加索引开始的。我之所以得出这个结论,是因为如果我不为 object_id 插入一个值,该语句就会神奇地起作用。另外,我从我们的开发版本的表中删除了索引,oila!它再次工作。我需要保留这个索引。

有没有人处理过这个问题?我即将使用事件记录重写脚本。整个脚本从 MS SQL Server 数据库中提取数据并插入到 MySQL 数据库中。

我还应该补充一点,当谈到用 Ruby 编程时,我真的不知道自己在做什么,而且我不确定这个脚本最终是如何用 Ruby 编写的。任何帮助将非常感激。谢谢!

最佳答案

这听起来像是引用问题。仔细查看错误信息:

 ' '')'

在您的 SQL 中,您将得到一个空格后跟一个空字符串文字,后跟一个右括号。您添加了 object_idobject_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, ...)

它启动和停止工作很奇怪,但这可能只是您调试工作的副作用。

关于mysql - 使用 dbi gem 的 ruby​​ 脚本在带有新索引的 mysql 表中插入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7940665/

相关文章:

ruby - 未能要求本地 gem

使用 MySQL 5.6 在 CentOS 6.4 x64 上安装 mysql2 gem 失败

php - 此查询是否安全,不会受到 sql 注入(inject)的影响?

php - 动态单选按钮,不同的无限名称

mysql - 使用 SUM(列字段)添加数据值 - MySQL

ruby - Mechanize 表单。提交返回空表单

ruby - 将 HAML 与自定义过滤器结合使用

ruby-on-rails-3 - 安装 PostgreSQL Mac OS X Lion 时出错

ruby-on-rails - $PATH 混淆 OSX Lion 上的 Postgres 和 Rails

php - MySQL和Php的文件路径插入多行