3

我正在尝试在数组中查找所有具有值的行,这是我的代码

require 'sqlite3'
db = SQLite3::Database.new('test.sqlite')
res = db.query("SELECT w1.synsetid
                FROM words w1
                WHERE w1.wordid IN (?)", arr)

arr:字符串数组

我得到这个错误

SQLite3::RangeException: bind or column index out of range

有什么帮助吗?

4

1 回答 1

4

第二个参数query是一个占位符值的数组:

- (Object) query(sql, bind_vars = [], *args)

这是创建语句、将参数绑定到它并调用执行的便捷方法:

query方法不知道它应该arr特别对待您的数组,它只看到一个占位符和多个值。

我认为你必须这样做:构建适当数量的占位符并将它们粘贴到 SQL 中。像这样的东西:

placeholders = (['?'] * arr.length).join(',')
res = db.query("select ... where w1.wordid in (#{placeholders})", arr)

您确切地知道其中的内容,placeholders因此在构建这样的 SQL 时,您不必担心使用字符串插值和注入问题。

如果您已经在使用 Rails,那么您还可以使用 ActiveRecord 包装 SQLite 表,然后使用通常的 ActiveRecord 接口:

words = Word.where(:wordid => arr)
于 2013-07-12T00:47:34.857 回答