如何在MySQL和PostgreSQL上使用exec_query或exec_update

时间:2018-12-21 07:42:01

标签: mysql ruby-on-rails postgresql activerecord

我正在尝试对MySQL和PostgreSQL使用prepare语句查询

以下代码适用于PostgreSQL

connection = ActiveRecord::Base.connection
query = 'UPDATE stores SET key = $1 WHERE id = $2'
connection.exec_query(query, "SQL", [[nil, 'x'], [nil, 1]]) 

但是当我将数据库和查询切换到以下时

query = 'UPDATE stores SET key = (?) WHERE id = (?)'
connection.exec_query(query, "SQL", [[nil, 'x'], [nil, 1]])

出现以下错误

ActiveRecord :: StatementInvalid:Mysql2 :: Error:您的SQL语法有错误;在第1行:“ UPDATE存储SET键=(?)WHERE id =(?)”中查看与MySQL服务器版本相对应的手册,以在'?)WHERE id =(?)'附近使用正确的语法

宝石版本:

gem 'mysql2', '0.4.5'
gem 'pg', '0.18.2'
gem 'rails', '5.1.4'

如何使用带有ActiveRecord的同时适用于MySQL和PostgreSQL的prepare语句?

3 个答案:

答案 0 :(得分:0)

我认为您应该尝试这样

exec_query('your query', name = 'SQL', binds = [[nil, 'x'], [nil, 1]])

答案 1 :(得分:0)

我仍然想知道是否有一种方法可以像使用Postgres适配器一样简单。同时,您可以先prepare,然后再execute

statement = ActiveRecord::Base.connection.raw_connection.prepare('SELECT ? AS foo;')
# => #<Mysql2::Statement:0x0000000920bf80>
statement.execute(1).to_a
# => [[1]]

答案 2 :(得分:0)

对于 MySQL,您可以使用 raw_connection 准备语句,然后执行语句:

st = ActiveRecord::Base.connection.raw_connection.prepare(
       'UPDATE users SET slug = ? WHERE id = ?'
     )
st.execute(username.parameterize, id)
st.close