Postgresql WHERE子句添加''左右?

Kim*_*gIl 0 postgresql ruby-on-rails pg ruby-on-rails-3

今天早上我切换到postgresql,现在我的地方选择不再工作了.

我想做的是超级简单:

shirt_ids = "1,5,6" # String generated by javascript
Shirt.where("id in (?)", shirt_ids)
Run Code Online (Sandbox Code Playgroud)

这给了我:

PG::Error: ERROR:  invalid input syntax for integer: "1,5,6"
LINE 1: SELECT "shirts".* FROM "shirts"  WHERE (id in ('1,5,6'))
Run Code Online (Sandbox Code Playgroud)

这有效:

Shirt.where("id in (#{shirt_ids})")
Run Code Online (Sandbox Code Playgroud)

但众所周知,这是不安全的.

我正在使用:

pg (0.13.2 x86-mingw32)
rails (3.2.2)
Run Code Online (Sandbox Code Playgroud)

Postgresql数据库是最新版本,今天早上我安装了它.

谢谢您的帮助.^

MrT*_*rus 6

我相信Postgres期待一个数组,而不是IN函数的字符串.如果将字符串转换为数组,它应该工作:

shirt_ids = "1,5,6"
Shirt.where('id in (?)', shirt_ids.split(','))
Run Code Online (Sandbox Code Playgroud)

此外,你可以这样做,看起来更清洁:

Shirt.where(:id => shirt_ids.split(','))
Run Code Online (Sandbox Code Playgroud)

  • 更准确地说,ActiveRecord在SQL片段中看到一个`?`而一个String作为值,然后它将该Ruby字符串转换为SQL字符串文字"1,2,3".我认为`shirt_ids.split(',').map(&:to_i)`会更安全. (2认同)