在 Rails 上的 Ruby 中,如何使用 dafult db 连接对象向数据库发送多个更新语句?

In Ruby on Rails, how can I send multiple update statements to the database using the dafult db connection object?

出于性能原因,我需要直接向数据库发出 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;

我尝试更改 database.yml 配置文件以包含 MULTI_STATEMENTS 标志但没有成功:

flags:
- MULTI_STATEMENTS

我设法完成这项工作的唯一方法是获取一个 Mysql2 客户端实例,并设置标志:

client = Mysql2::Client.new(host: 'localhost', ... , flags: Mysql2::Client::MULTI_STATEMENTS)
client.query updates

但这似乎不是一个好主意,因为它会将应用程序与 mysql2 gem.

一起锁定

这是 mysql2 gem、ActiveRecord 的问题,还是我遗漏了一些重要的东西?

因此,我发现没有理由继续使用 ActiveRecord,因为我没有使用它,所以我决定坚持使用 Mysql2::Client

只需确保 flags: Mysql2::Client::MULTI_STATEMENTS 已设置,并记得在发出另一个命令之前清除任何先前命令的结果:

while client.next_result
end

此外,尝试使用 ActiveRecord 的原因是事务管理。可以用以下方法做同样的事情:

client.query 'BEGIN'
client.query 'COMMIT'
client.query 'ROLLBACK'