【问题标题】:Ruby array as parameter to a plain SQL QueryRuby 数组作为普通 SQL 查询的参数
【发布时间】:2016-04-15 22:37:23
【问题描述】:

我正在构建一个命令行应用程序,该应用程序需要连接各种 postgresql 数据库并在这些数据库中执行不同的查询作为准备好的语句。在特定的查询中,我需要将IN 子句与ActiveRecord 的connection_raw 方法结合使用。我的代码是这样的:

ActiveRecord::Base.connection_raw.prepare('read_publications', "UPDATE publications SET readed = TRUE WHERE id IN ($1);") 

之后,我尝试执行这个查询:

ActiveRecord::Base.connection_raw.exec_prepared('read_publications', [1,2,3,4])

问题是这不起作用。查询运行时会出现以下错误:

没有将数组隐式转换为整数

我做错了什么?是否存在一种方法可以将这个数组转换为IN 子句可以理解的值?

【问题讨论】:

  • 你会在这里找到你的解决方案stackoverflow.com/questions/13805627/…
  • 感谢@fanta,但我只介绍了在没有 ActiveRecord 干扰的情况下使用准备好的语句的基础知识。我认为这里的问题是专门处理 SQL 的 IN 和一组 Ruby 值。
  • 是的@muistooshort!你是对的!我做了更正。是的!问题是您在评论中描述的问题。
  • 我试图弄清楚如何使 pg gem(它是与 PostgreSQL 对话的底层 gem)与数组一起玩。总是有像a.length.times.map { |i| "$#{i + 1}" }.join(',') 这样的东西来构建一个占位符列表以匹配您的数组长度,如果我找不到更好的东西,一些字符串争论可以将占位符放入您的 SQL 中。

标签: sql ruby-on-rails ruby postgresql


【解决方案1】:

如果您使用的是原始连接,则不能像使用 ActiveRecords 那样传入数组。 ActiveRecord 会为您做一些预处理。如果需要原始 SQL,则需要为每个数组元素设置一个参数。

arr = [1,2,3,4]
i = 1
param = []
arr.each { param.push(i); i+=1; }
sql = "UPDATE publications SET readed = TRUE WHERE id IN ($"+param.join(',$')+");"
ActiveRecord::Base.connection_raw.prepare('read_publications', sql)
ActiveRecord::Base.connection_raw.exec_prepared('read_publications', arr)

但是,文档说数组参数必须采用某种格式:

https://deveiate.org/code/pg/PG/Connection.html#method-i-exec_prepared

params 是 SQL 查询的可选绑定参数数组。 params 数组的每个元素都可以是:

形式的哈希: {:value => String(绑定参数的值) :format => Fixnum (0 表示文本,1 表示二进制) }

查看类似问题:Prepare and execute statements with ActiveRecord using PostgreSQL

【讨论】:

    猜你喜欢
    • 2019-03-03
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 2019-12-06
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    相关资源
    最近更新 更多