2008-10-15 70 views
9

我需要更改正在使用的生產數據庫。只需添加幾列。我使用遷移對開發數據庫進行了更改。更新生產數據庫,同時保留現有數據並且不會中斷操作太多的最佳方式是什麼?Rails:更改生產數據庫的最佳方式

這是MYSQL,我將需要添加數據到列以及已有的記錄。一列可以有一個默認值(它是布爾值),但另一列是時間戳,應該有一個任意的後備值。行數不是很大。

因此,如果我使用遷移,我如何添加數據以及如何才能完成這兩個操作(或三個 - 我在生產數據庫上添加數據 - 最新遷移,而不是最初通過遷移構建?相信他們使用的模式代替)

回答

6

這聽起來像你的狀態下生產的DB模式沒有按是與你在開發中使用的內容完全一致(儘管它不完全清楚)。我會在沙子上畫一條線,讓這個prod db處於更好的狀態。基本上你想要做的是確保prod數據庫有一個「schema_info」表,它列出了你不想在生產中運行的任何遷移。然後,您可以將遷移添加到您的內容中,並且它們將針對生產分貝進行處理。

一旦你完成了,你可以編寫添加模式更改或添加數據的遷移,但有一點你需要非常小心的是,如果你使用遷移添加數據,你必須在遷移中定義模型本身,就像這樣:

class AddSomeColumnsToUserTable < ActiveRecord::Migration 
    class User < ActiveRecord::Base; end 
    def self.up 
    add_column :users, :super_cool, :boolean, :default => :false 
    u = User.find_by_login('cameron') 
    u.super_cool = true 
    u.save 
    end 

    def self.down 
    remove_column :users, :super_cool 
    end 
end 

這樣做的原因是,在未來,你可能完全消除模型,一些重構或其他期間。如果您沒有在「User.find_by_login ...」行上定義用戶類,遷移將引發異常,這是一個很大的麻煩。

4

有沒有你不使用你在你的開發環境中使用的相同的遷移原因

+2

數據庫已經在使用,所以我不想丟失現有的數據,並且寧願不必花時間重建和重新填充,如果我可以避免它。 – srboisvert 2008-10-15 18:22:41

+0

那麼,遷移是破壞性的?或者您目前正在使用遷移,但以前從未在生產中使用它們,因此它會嘗試執行所有遷移,其中一些遷移較舊且不再相關,因此可能會導致問題? – Matt 2008-10-15 18:25:19

2

在遷移應採用非破壞性的添加與add_column列:它會生成一個「ALTER TABLE」語句如果你知道一旦創建了什麼,你可以在遷移中填入值(如果行數爲l,你可以選擇一個耗時較少的選擇) ARGE)。

刪除或更改列的定義是,我認爲,取決於平臺:有些將允許刪除列,其他人將執行重命名 - 創建 - 選擇 - 刪除命令序列。

要獲得更具體的信息,我們需要更多信息:您正在查看什麼樣的遷移,您在哪個平臺上運行,是否需要將值設置爲遷移的一部分?像這樣的東西會幫助很多 - 只需編輯問題,這將推回它的名單。

14

我公司始終遵循這個程序:

  • 轉儲督促數據庫使用mysqldump命令
  • 填充開發/測試使用mysql命令在開發中
  • 運行遷移數據庫轉儲/測試
  • 檢查遷移工作
  • 使用mysqldump命令轉儲prod數據庫(因爲它可能已更改)在服務器上保留備份
  • 個PROD上(使用capristano)
  • 測試遷移運行遷移一直在督促工作
  • 喝啤酒(一邊看錯誤日誌)
相關問題