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

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

第一次看到这个问题。我正在构建一个 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/

相关文章:

django - 在数据库中存储对 AWS S3 对象的引用的最佳实践?

postgresql - PostgreSQL 中多列的主键?

postgresql - Bookshelf.js 多对多关系

ruby-on-rails - 为什么 Rails 应用程序在底部显示数据库信息?

ruby-on-rails - 有人可以推荐一个好的 gem 来处理联系人吗?

ruby-on-rails - 为什么 InstanceMethods 模块已被弃用?

ruby-on-rails - 如何在 Rails 中生成唯一的请求 ID?

sql - rails : Get related records having belonging to category having a particular enum attribute

ruby-on-rails - 连接两台流浪机器

ruby-on-rails - 我应该如何升级 Rails 应用程序以使用最新版本的 Rails