2012-01-14 103 views
1

我編寫了一個存儲過程並希望在Rake任務中執行它。無法使用ActiveRecord從Rake任務執行MySQL sql「source」命令

調用存儲過程(通過「呼叫」的聲明),我應該與失敗,因爲以下錯誤的來源命令創建過程之前:

Mysql2::Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'source import_legacy_database.sql' at line 1: source import_legacy_database.sql

執行下面的線時發生此錯誤:

ActiveRecord::Base.connection.execute "source import_legacy_database.sql" 

同樣的命令「源import_legacy_database.sql」運行正常時,在控制檯上,而不是在Rake任務。

如果我不叫這個命令然後

ActiveRecord::Base.connection.execute "call import_legacy_database()" 

,因爲數據庫沒有找到程序,因爲它不存在失敗。

謝謝先進。

回答

1

我終於用在批處理模式http://dev.mysql.com/doc/refman/5.5/en/batch-mode.html

sh "mysql -u root mydb_development -e 'source import_legacy_database.sql'" 
+1

如果您的應用程序服務器和數據庫服務器位於同一臺計算機上,那麼這非常棒,但在大多數生產環境中,當它們不在時,此方法將不起作用。 – jwg2s 2012-11-05 15:36:04

2

我相信這是因爲source命令是特定於MySQL命令行客戶端的實現,而不是由ActiveRecord實現的API的一部分。例如,如果您嘗試在ActiveRecord中使用DELIMITER命令,則會發生同樣的情況。

+0

有一個Rake任務來執行SQL語句的任何其他方式SH耙方法和執行的SQL命令? – 2012-01-15 00:06:06

+0

@negarnil我不確定。我搜索了一下,但沒有找到答案。我想你可以使用Ruby代碼加載文件,並將其拆分到SQL分隔符中以執行每個結果部分。 – 2012-01-15 00:38:30