2010-02-02 33 views
2

我有一堆SQL语句要在数据库上执行。 (据我所知,Rails没有提供任何方法,例如创建视图,添加外键等等。这主要是因为非Rails与数据交互。)本质上,我正在做以下:ActiveRecord :: Base.connection.execute一次只能执行一条语句吗?

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

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

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

+0

Hrm ...这很有趣。我可以吐出SQL语句,并执行'sqlite3 db.sqlite3 2010-02-02 15:47:55

+0

尽管......它根本没有抱怨,这是奇怪的部分。似乎忽略了第一个陈述的所有内容,并且默默地失败了。 – 2010-02-02 15:52:42

+0

可能是由于不同的dbs,因为我试过在mysql上,而你在sqlite上 – nas 2010-02-02 15:59:57