出于绩效原因,我需要将SQL语句(插入和更新)直接向数据库发布。执行大型插入语句,我没有问题:
@conn = ActiveRecord::Base.connection
inserts = "INSERT INTO clients (code, name) VALUES ('abc123', 'Alyx'), ('xyz123', 'Gordon') ...many more...;"
@conn.execute inserts
但是,我很难执行一批更新,例如:
updates = "UPDATE clients SET name='Julia' WHERE id=1; UPDATE clients SET name='Eli' WHERE id=2; ...many more..."
@conn.execute updates
# or
@conn.update updates
因为这给了我一般的SQL语法错误:
ActiveRecord::StatementInvalid: Mysql2::Error: You have an error in your SQL syntax;
我已经尝试更改数据库.yml配置文件以包含Multi_statements标志而无需成功:
flags:
- MULTI_STATEMENTS
我设法完成这项工作的唯一方法是获得一个MySQL2客户端实例,其中标志集:
client = Mysql2::Client.new(host: 'localhost', ... , flags: Mysql2::Client::MULTI_STATEMENTS)
client.query updates
,但这似乎不是一个好主意
MySQL2宝石,ActivereCord还是我缺少必需的东西?
所以,我发现没有理由继续使用ActivereCord,因为我不使用它,所以我决定坚持使用Mysql2::Client
。
只需确保设置flags: Mysql2::Client::MULTI_STATEMENTS
并记住在发出其他命令之前清除任何以前命令的结果:
while client.next_result
end
此外,尝试使用ActivereCord的原因是交易管理。可以对以下操作做同样的事情:
client.query 'BEGIN'
client.query 'COMMIT'
client.query 'ROLLBACK'