我正在使用带有ActiveRecord和PostgreSQL的Ruby on Rails。
如何执行多个SQL查询?
我需要它来运行自定义迁移脚本,例如:
Foo.connection.execute <<-SQL.split(';').map(&:strip).join
delete from metadata where record_type = 'Foo';
TRUNCATE table1 RESTART IDENTITY;
TRUNCATE table2 RESTART IDENTITY;
delete from schema_migrations where version > '20120806120823';
SQL
我不接受用户的数据,所以我不担心sql注入。
MySQL中的CLIENT_MULTI_STATEMENTS
可能是什么?
来自MySQL / PHP文档:
CLIENT_MULTI_STATEMENTS :告诉服务器客户端可能发送 单个字符串中的多个语句(以“;”分隔)。如果这 如果未设置标志,则禁用多语句执行。见 请注意此表后面有关此标志的更多信息。
答案 0 :(得分:6)
它应该与PostgreSQL开箱即用,用pg gem和rails 3.2:
进行检查class Multitest < ActiveRecord::Migration
def up
execute <<-SQL
create table x(id serial primary key);
create table y(id serial primary key, i integer);
SQL
end
def down
end
end
另外,操纵schema_migrations
直接看起来很奇怪。
答案 1 :(得分:3)
对于mysql
querys = File.read("/where/is/myquerys.sql")
# or
querys = <<-SQL
TRUNCATE table1 RESTART IDENTITY;
TRUNCATE table2 RESTART IDENTITY;
delete from schema_migrations where version > '20120806120823';
SQL
querys.split(';').map(&:strip).each do |query|
execute(query)
end
您可能也想看到这个问题: Invoking a large set of SQL from a Rails 4 application
答案 2 :(得分:0)
是的,您需要CLIENT_MULTI_STATEMENTS
:
在database.yml
:
development:
adapter: mysql2
database: project_development
flags:
- MULTI_STATEMENTS
然后在你的代码中:
connection.execute(multistatement_query)
# Hack for mysql2 adapter to be able query again after executing multistatement_query
connection.raw_connection.store_result while connection.raw_connection.next_result