0

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

谢谢!

4

1 回答 1

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
于 2012-10-02T19:31:16.910 回答