我有一堆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
循環。它解決了問題,但如果有更優雅的解決方案,我會有興趣聽到它們。
Hrm ...這很有趣。我可以吐出SQL語句,並執行'sqlite3 db.sqlite3
2010-02-02 15:47:55
儘管......它根本沒有抱怨,這是奇怪的部分。似乎忽略了第一個陳述的所有內容,並且默默地失敗了。 – 2010-02-02 15:52:42
可能是由於不同的dbs,因爲我試過在mysql上,而你在sqlite上 – nas 2010-02-02 15:59:57