13

我正在将 Ruby on Rails 与 ActiveRecord 和 PostgreSQL 一起使用。

如何执行多个 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-injection。

CLIENT_MULTI_STATEMENTS可能是在 MySQL 中的东西?

来自 MySQL/PHP 文档:

CLIENT_MULTI_STATEMENTS:告诉服务器客户端可以在一个字符串中发送多个语句(用“;”分隔)。如果未设置此标志,则禁用多语句执行。有关此标志的更多信息,请参阅此表后面的注释。

4

3 回答 3

9

它应该与 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直接操作看起来很奇怪。

于 2012-08-20T12:59:43.830 回答
5

对于 mysql

queries = File.read("/where/is/myqueries.sql")
# or
queries = <<-SQL
 TRUNCATE table1 RESTART IDENTITY;
 TRUNCATE table2 RESTART IDENTITY;
 delete from schema_migrations where version > '20120806120823';
SQL

queries.split(';').map(&:strip).each do |query| 
  execute(query)
end

你可能也想看看这个问题: Invoking a large set of SQL from a Rails 4 application

于 2017-03-24T04:59:41.103 回答
4

是的,您需要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

有关详细信息,请参阅https://stackoverflow.com/a/11246837/338859

于 2017-04-26T11:47:00.140 回答