这是我第一次看到这个问题。我正在构建一个运行sanitize_sql_array的SQL数组,Rails在返回值中添加额外的,不必要的单引号。所以不要回来:
SELECT DISTINCT data -> 'Foo' from products
它返回:
SELECT DISTINCT data -> ''Foo'' from products
当然Postgres不喜欢。
以下是代码:
sql_array = ["SELECT DISTINCT %s from products", "data -> 'Foo'"]
sql_array = sanitize_sql_array(sql_array)
connection.select_values(sql_array)
请注意,当我使用较短且更常见的时候会发生同样的事情:
sql_array = ["SELECT DISTINCT %s from products", "data -> 'Foo'"]
connection.select_values(send(:sanitize_sql_array, sql_array))
以前见过这个吗?它与使用HStore有关吗?我绝对需要对字符串进行清理,因为字符串Foo实际上来自用户输入的变量。
谢谢!
答案 0 :(得分:4)
你给sanitize_sql_array
一个包含hstore表达式的字符串,并期望sanitize_sql_array
理解该字符串包含一些hstore内容;那问得太多了,sanitize_sql_array
只知道字符串和数字之类的简单事情,它不知道如何解析PostgreSQL的SQL扩展甚至标准SQL。您期望sanitize_sql_array
如何区分(例如,恰好包含'11 * 23'
的字符串和应该表示算术表达式11 * 23
的字符串?
您应该将data -> 'Foo'
分成两部分,以便sanitize_sql_array
仅在清理字符串时看到字符串部分:
sql_array = [ 'select distinct data -> ? from products', 'Foo' ]
sql = sanitize_sql_array(sql_array)
这将为您提供您正在寻找的SQL:
select distinct data -> 'Foo' from products