ruby中使用数组进行数据库查询

Mhd*_*ori 3 ruby sqlite

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

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

arr:字符串数组

我收到这个错误

SQLite3::RangeException: bind or column index out of range
Run Code Online (Sandbox Code Playgroud)

有帮助吗?

mu *_*ort 5

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

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

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

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

我认为您必须以这种困难的方式做到这一点:构建适当数量的占位符并将它们粘贴到 SQL 中。像这样的东西:

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

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

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

words = Word.where(:wordid => arr)
Run Code Online (Sandbox Code Playgroud)