2010-02-02 68 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