我正在尝试对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语句?
答案 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