ActiveRecord :: Base.connection.execute一次只执行一个语句吗?

时间:2010-02-02 15:28:13

标签: ruby-on-rails ruby sqlite

我有一堆SQL语句要在数据库上执行。 (据我所知,我正在做Rails不提供方法的东西:创建视图,添加外键等等。它主要用于非Rails与数据的交互。)本质上,我正在做以下内容:

sql = "statement_1; statement_2; statement_3; etc;"
ActiveRecord::Base.connection.execute(sql)

或者使用新行,例如:

sql = <<EOF
statement_1;
statement_2;
statement_3;
etc;
EOF
ActiveRecord::Base.connection.execute(sql)

(显然,这些陈述只是占位符,但根据我的测试,我不认为他们的内容很重要。)

在任何一种情况下,只执行第一个语句而其他语句似乎被忽略。那是怎么回事?每当我一次尝试多个语句时,我只会看到第一个语句的效果。我需要单独执行每一项吗?一组语句来自一个文件,所以只需加载文件的内容并执行即可。如果有更好的策略可以采用,我会对它们感兴趣。

我希望documentation on execute能够发光,但除了使用单数(“声明”)之外,它不会。也许是因为我正在使用的数据库引擎? (作为参考,我现在正在使用SQLite。)

更新:我最后编写了一个执行以下操作的方法:

def extract_sql_statements(sql)
  statements = []

  sql.split(';').each do |statement|
    statement.strip!

    unless statement.empty?
      statement += ';'
      statements << statement
    end
  end

  return statements
end

...然后循环statements。它解决了这个问题,但如果有更优雅的解决方案,我会有兴趣了解它们。

1 个答案:

答案 0 :(得分:1)

如果查看rails代码,那么你会发现execute方法运行传递的sql,所以它应该基本上运行你的所有查询,只要它们是';'分开并有效。

编辑:对不起!不,它不会因为它会添加';'在您的查询字符串和抱怨错误语法之间