ruby-on-rails - Rails exec_query 绑定(bind)被忽略

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

我正在尝试使用 exec_query 运行任意查询,其中的值是通过绑定(bind)引入的,但出现了意外错误。

在控制台中运行

sql = 'SELECT * FROM foobars WHERE id IN (?)'
name = 'query_name_placeholder'
binds = [FooBar.first]
ActiveRecord::Base.connection.exec_query sql, name, binds

产生这个错误:

Account Load (7.9ms)  SELECT  "foobars".* FROM "foobars"  ORDER BY "foobars"."id" ASC LIMIT 1
PG::SyntaxError: ERROR:  syntax error at or near ")"
LINE 1: SELECT * FROM foobars WHERE id IN (?)
                                             ^
: SELECT * FROM foobars WHERE id IN (?)
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR:  syntax error at or near ")"
LINE 1: SELECT * FROM foobars WHERE id IN (?)
                                             ^
: SELECT * FROM accounts WHERE id IN (?)
from /Users/foo_user/.rvm/gems/ruby-2.2.4@foo_project/gems/activerecord-4.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:641:in `prepare'

绑定(bind)语法似乎被忽略了?我也尝试过 ... WHERE id = ?,但无济于事。

最佳答案

mu 太短了,让你走了一段路。作为引用,这里是该方法的文档:https://apidock.com/rails/ActiveRecord/ConnectionAdapters/DatabaseStatements/exec_query

他是对的,您需要使用底层数据库的绑定(bind)语法在 SQL 字符串中设置绑定(bind)变量。对于 Oracle,这是 :1, :2 对于 PostgreSQL,这是 $1, $2... 所以这是第一步。

第二步是您需要构建绑定(bind)对象,它们是 QueryAttribute 对象,而不仅仅是要传入的值。这有点笨拙,但这是一个示例:

binds = [ ActiveRecord::Relation::QueryAttribute.new(
    "id", 6, ActiveRecord::Type::Integer.new
)]
ApplicationRecord.connection.exec_query(
    'SELECT * FROM users WHERE id = $1', 'sql', binds
)

我刚刚花了一整天的时间查看单元测试和源代码,试图弄清楚这一点。

关于ruby-on-rails - Rails exec_query 绑定(bind)被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407700/

相关文章:

ruby - GitHub API : Tag a commit belongs to ( parallel for git describe --tag <sha> )

ruby - 757: 意外的标记在 'ï»Â¿{ (JSON::ParserError)

php - 在 UPDATE/SET 语句中取消嵌套,PostgreSQL/PHP

sql - 使用选定的值作为 postgres 中的表名

ruby-on-rails - 访问 a 的属性在 Rails 中有很多关联

javascript - form_for 未触发 Ajax 事件

ruby-on-rails - 在 Rails 中测试时如何设置 HTTP_REFERER?

ruby-on-rails - 为什么在测试时模拟数据?

ruby-on-rails - rails 中的数组字段消除了编辑时的重复元素

ruby-on-rails - gem 安装 rmagick 错误