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