2012-10-26 209 views
7

我正在考慮在下一個項目中使用Ruby on Rails。瞭解部署一個rails網站很容易理解(聽起來像我將使用Phusion PassengerGerrit的Ruby on Rails數據庫部署

但現在我想弄清楚數據庫。我看到很多關於「數據庫遷移」的信息,它們允許我使用紅寶石代碼來更新數據庫。我還看到,我可以同時創建以下這些遷移的變體。

但是,我只能看到這是如何在一個方向乾淨地工作。試想一下,如果我突然說「顏色列不能爲空」。因此,將使它成爲必需,並將所有NULL條目設置爲默認值。但下降會做什麼?如果你關心它和它的啓動方式相同,你不能只將默認值設置爲NULL。

這對發佈到生產並不重要。這可能只是在一個方向完成(在向上方向)。 但是,我想使用Gerrit進行代碼評論,並且在允許簽入前設置一個機器人來運行構建...

那麼這怎麼可能?從一個代碼審查到下一個代碼審查,構建服務器將檢出新的一組代碼,並運行遷移?但是,如果發生這種情況,它甚至不會保留之前的遷移代碼,那麼它如何運行下降步驟?作爲一個更簡單的例子,我沒有看到如何檢查舊版本的代碼和向後「db遷移」。

回答

3

是的,您無法檢出舊版本的代碼,然後從較新版本的代碼運行向下遷移。在回滾到舊代碼之前,您需要運行向下遷移。

有很多很多情況下,下降遷移是不實際或不可能的。這不一定是壞事。這隻意味着你已經定義了一個「不返回點」,你不能將數據庫恢復到以前的狀態。

像創建表或添加列的遷移很容易通過簡單地銷燬該表或刪除該列來逆轉。不過,如果你正在做的事情比較複雜,如添加默認值或走動的數據,那麼你可以告訴Rails,這是不可能扭轉這種遷移:

def down 
    raise ActiveRecord::IrreversibleMigration 
end 

我會建議格里特不應該承擔什麼關於數據庫。每次部署新版本時,應該從新數據庫開始,然後運行db:migrate以運行所有遷移。您可以使用像factory_girl這樣的寶石來爲您的應用填充演示數據以用於測試目的。

+0

接受的答覆。我仍然不確定我將使用什麼確切的策略,因爲我希望構建以某種方式測試遷移。我可能會在構建之前創建一個數據庫快照,然後讓這些遷移在其上運行。 –