Ruby on rails 如何使用Rails在一个查询中执行多个语句?

Ruby on rails 如何使用Rails在一个查询中执行多个语句?,ruby-on-rails,ruby,ruby-on-rails-3,postgresql,activerecord,Ruby On Rails,Ruby,Ruby On Rails 3,Postgresql,Activerecord,我将RubyonRails与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

我将RubyonRails与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

Foo.connection.execute它应该可以用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
class Multitest
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
querys=File.read(“/where/is/myquerys.sql”)
#或

queries=是的,您需要
客户机多语句

数据库.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

有关详细信息,请参见

我认为在实际示例中,您是从文件中读取脚本的,因此您不能像示例中那样对每个语句循环执行一次
execute
?如果它直接出现在你的代码中,你可以把语句放在一个数组中,然后在上面循环。希望编辑能准确地反映你的意图。如果没有,请告诉我,或者重新编辑。就像Craig Ringer所说的,简单地调用
连接有什么问题。用一条语句多次执行
?我已经做了很多次了(有一次,作为Rails应用程序中的第一次迁移,运行了几十个表的遗留SQL模式转储)。我不想进行多次网络调用。这就是我现在正在做的。在这种情况下,网络调用在网络上相当慢,但我可以忍受删除和截断。问这个问题主要是想知道。谢谢,我会检查迁移的代码。但是迁移是如何执行的,而ActiveRecord是如何执行的呢?但是,如何从ActiveRecord运行多个查询?不适用于MySQL。ActiveRecord在Postgres上执行成功,在MySQL上执行失败。您没有阅读问题。这是写给Postgres的,不是MySQL。啊,是的。我的错。对我这个mysql用户来说,在谷歌搜索了一个通用的多语句问题之后,找到这个答案仍然很有用!:)我无法使此
多个\u语句
标志正常工作。说句公道话,我没有尽力。但我最终只是将我的语句分开,并对每个语句调用
execute
。我只有几个,所以结果很好,不需要修改MySQL或ActiveRecord。