2009-06-17 137 views
20

是否rake db:遷移只添加新的遷移,還是會刪除所有遷移/更改並構建新的一切?究竟是什麼耙db:migrate做什麼?

我認爲rake拋出一個錯誤,因爲它試圖訪問在遷移042中刪除的遷移040中的表屬性。不知怎的,我的數據庫和耙子不同步,我想修復它們。

你專家在那裏 - 是常見的耙出去與遷移不同步?我怎麼能避免這個(不,我不手動編輯我的架構或耙文件)。

回答

14

每當你使用腳本(如腳本/生成模型......)的新移民加入到正確的目錄準備與真正的數據庫同步的創建遷移。

其實耙分貝:遷移只是檢查哪個丟失遷移仍然需要,而無需關心previouse那些被應用到數據庫中。

當然,如果你修改使用其他方式的數據庫是常見的獲得外的同步事情,因爲如你所說,你可以發現你要遷移到的東西是下面改變。

21

當您使用rails遷移時,會自動創建一個名爲schema_migrations的表,該表通過存儲每個遷移的版本號(這是在文件名中預設遷移名稱的編號),以跟蹤已應用遷移的情況,即db/migrate/_20090617111204__migration.rb)。當您運行rake db:migrate遷移了,只有以前沒有被運行的遷移(即它們的版本沒有在表中包含)將運行(因爲這個原因,改變這種運行db:migrate當包括已經執行不會有任何影響遷移)。在向下遷移時,在schema_migrations中發現的所有版本都大於您要回滾到的版本將被撤消。

+2

謝天謝地,這個答案爲我提供了更多細節。爲什麼db:migrate文檔中的schema_migrations不在任何位置?這是我對軌道系統如何「發現哪些移動應該運行」的理解的缺失部分! – 2013-01-08 22:14:17

5

遷移意味着你從當前版本到新版本移動(如在第一個答案是說)。使用rake db:migrate可以將任何新的更改應用於您的模式。但是如果你想回滾到以前的遷移,你可以使用rake db:rollback來取消新的更改,如果它們被錯誤定義的話。小心:這樣做會使數據丟失。