【发布时间】:2013-06-24 08:22:53
【问题描述】:
我一直在努力让批量插入在我的 Rails 设置中工作。我收到以下错误消息。
SQLite3::SQLException: near ",": 语法错误: INSERT INTO tokens (article_id,count,'origin','created_at','updated_at','token') VALUES (42 ,1,'职称','2013-06-24 11:54:31 +0400','2013-06-24 11:54:31 +0400','5'), (42,1,'职称' ,'2013-06-24 11:54:31 +0400','2013-06-24 11:54:31 +0400','公司'), (42,1,'职称','2013-06- 24 11:54:31 +0400','2013-06-24 11:54:31 +0400','To'), (42,1,'Title','2013-06-24 11:54:31 +0400','2013-06-24 11:54:31 +0400','观看'), (42,1,'标题','2013-06-24 11:54:31 +0400','2013 -06-24 11:54:31 +0400','In'), (42,1,'Title','2013-06-24 11:54:31 +0400','2013-06-24 11: 54:31 +0400','大数据')
当我将上述 SQL 字符串粘贴到 Firefox 的 SQLite 插件 并执行查询时,它工作正常。所以我认为我在 Rails 中如何使用这个字符串应该有问题。
我有以下设置。
- Ruby 2.0
- Rails 3.2.13
- sqlite3 1.3.7
- Ubuntu 12.04
这里是批量上传的方法。它需要 2 个参数。 1 包含字符串标记和每个标记的数字计数的哈希。第二个参数只是一个字符串。
在 Article 类的实例上调用该方法。所以 self.id 就是文章 ID。
我还尝试通过 activerecord-import gem 批量上传,但同样失败,并出现类似的语法错误消息。
def token_list(names,originvar)
vec =[]
names.each do |i, count|
time = Time.now
vec << "(#{self.id},#{count},'#{originvar}','#{time}','#{time}','#{i}')"
end
raw_sql = "INSERT INTO tokens (article_id,count,'origin','created_at','updated_at','token') VALUES #{vec.join(", ")}"
Token.connection.execute(raw_sql)
end
提前致谢。
【问题讨论】:
-
(我知道这不是一个相当的骗子,因为这个问题不涉及Rails,但SQLite语法的核心问题是相同的,OP应该不需要帮助一旦解决了,就使用 Rails 位。)
-
还有,呜呜呜呜呜!您当前的代码,如果它是正确的 SQLite 语法,将非常容易受到 SQL 注入的影响(或者,如果您不担心,因为这是一个仅限内部的事情,非常容易因缺乏转义而出现错误)。考虑以另一种方式构建查询。
-
谢谢 Matchu,我之前看过这个问题并用它来制定我的查询。正如我所说,当我在 Rails 之外执行查询时,SQL 工作。所以问题出在我的代码或 SQLite gem 中。感谢您的关注。
标签: ruby-on-rails sqlite