gpt4 book ai didi

ruby-on-rails - sanitize_sql_array 正在添加额外的、不必要的引号来查询

转载 作者:行者123 更新时间:2023-11-29 14:12:17 25 4
gpt4 key购买 nike

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

谢谢!

最佳答案

您给 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

关于ruby-on-rails - sanitize_sql_array 正在添加额外的、不必要的引号来查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12696727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com