我在使用postgres的rails 2中使用活动记录条件时遇到问题。我的问题是,当我尝试使用此查询时(我使用geokit,但这不是问题)
Table.all(:conditions => ["id IN (?)", id_array.join(",")], :origin => origin, :within => 20)
我遇到了这个问题:
ActiveRecord::StatementInvalid: PG::Error: ERROR: invalid input syntax for integer: "21,28"
LINE X: ...OM "tables" WHERE (((id IN (E'21,28...
为什么要把“E”放在那里以及如何摆脱它?
答案 0 :(得分:3)
使用id_array.join(",")
,您将一个字符串传递给该函数。当所有字符串在生成的SQL查询中被转义并被单引号包围时,您自然会得到SQL错误,就像在此IN
语句中一样,您只能使用以逗号分隔的整数。
简单的解决方案是直接将数组传递给函数。然后,ActiveRecord自己在SQL中创建正确的值。您可以像这样使用它:
Table.all(:conditions => ["id IN (?)", id_array], :origin => origin, :within => 20)
或者,您可以使用这种类似ruby的语法生成完全相同的SQL查询:
Table.all(:conditions => {:id => id_array}, :origin => origin, :within => 20)
答案 1 :(得分:1)
您已被定向到另一条路径。但要回答你的问题:
为什么要把“E”放在那里......
那是escape string syntax of PostgreSQL。 PostgreSQL的默认行为已随版本9.1更改,不再解释反斜杠转义,除非在开头单引号前面有E
。新行为反映了SQL标准。
'one backslash: \' -- backslash has no special meaning in Postgres 9.1
E'one backslash: \\' -- must use E'' syntax to interpret escape sequences
有些客户端可以安全地将E
放在每个字符串文字的前面,以获得相同的行为,无论PostgreSQL版本或standard_conforming_strings
的设置如何。其他人向服务器询问设置并相应地调整语法。无论哪种方式,将E
放在不包含反斜杠的字符串文字前面只是浪费(极少数)CPU周期。
答案 2 :(得分:0)
我认为你不需要加入这些价值观。甚至在Rails 2.据说,试试这个:
Table.all(:conditions => ["id IN (?)", id_array], :origin => origin, :within => 20)
答案 3 :(得分:0)
请改为尝试:
Table.all(:conditions => ["id IN (#{id_array.join(",")})"], :origin => origin, :within => 20
答案 4 :(得分:0)
我遇到了同样的问题,mysql试图运行count()函数和我用来修复它的语法
Issue.all(:conditions => "status_id IN (5, 15, 19, 21, 25)").count