sanitize_sql_array正在为查询添加额外的,不必要的引号

时间:2012-10-02 19:12:53

标签: ruby-on-rails ruby-on-rails-3 postgresql activerecord hstore

这是我第一次看到这个问题。我正在构建一个运行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实际上来自用户输入的变量。

谢谢!

1 个答案:

答案 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