我有一堆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
。它解决了这个问题,但如果有更优雅的解决方案,我会有兴趣了解它们。
答案 0 :(得分:1)
如果查看rails代码,那么你会发现execute方法运行传递的sql,所以它应该基本上运行你的所有查询,只要它们是';'分开并有效。
编辑:对不起!不,它不会因为它会添加';'在您的查询字符串和抱怨错误语法之间