2015-09-03 99 views
3

這是一個常見的做法,django項目的工作人員通常會將遷移與其他代碼一起推送到版本控制系統。爲什麼需要將django遷移到版本控制系統

我的問題是爲什麼這種做法如此普遍?爲什麼不推動更新的模型,每個人都在本地生成遷移。這種方法也可以減少解決遷移衝突的工作。

回答

5

如果您沒有將它們提交到VCS,那麼會發生什麼情況會導致人們對模型進行潛在的衝突更改。

當最終準備好部署時,您仍然需要django進行新的遷移,然後再將每個修改組合在一起。這只是創造了一個額外的不必要的步驟,可以引入錯誤。

您也假定每個人都將始終能夠處理代碼的最新版本,當您開始處理尚未準備好合併到主線的分支時,這並不總是可行。

+1

一個例子是:person A從'master'創建了一個分支並創建了一個新的遷移'0010',B從'master'創建了一個分支並創建了一個新的遷移'0010'。一個合併開發早於B,當B拉最新的變化,並試圖將他的代碼合併到「主」,他得到了重複的遷移。如果你不跟蹤遷移,B會很困惑。 –

+0

OP建議推送模型文件,並從這些文件生成遷移,應該照顧到這一點。我自己也想過這個。解決不一致的遷移問題,尤其是對於共享分支機構和正在進行的工作,一直是時間的極大浪費。我在@Alasdair關於自動填充的下面看到了一點(這是對我來說很有意義的一個例外,但如果您使用工廠而不是自定義遷移,則不適用)。我希望看到有關避免移民衝突的最佳做法和/或更好的解決方法的更好建議。例如, – szeitlin

+0

,我剛碰到一個我經常遇到的問題,當我嘗試遷移時,合併依賴關係丟失。問題是,單獨應用程序中的遷移文件並不總是跨分支同步。 django錯誤不會給你導致問題的遷移文件的完整路徑,只有數字。 #fail – szeitlin

2

首先,版本控制中的遷移允許您在生產中運行它們。

其次,遷移並不總是自動生成。例如,如果您向模型添加新字段,則可以編寫遷移來填充該字段。這種遷移不能從模型中重新創建。如果該遷移不在版本控制中,那麼其他人將無法運行它。

+1

但我們也可以在生產中生成遷移,然後應用這些遷移。這種方法有問題嗎? – Ishtiaq

+0

是的,理論上你可以在生產中生成遷移(雖然不是自定義遷移,如上所述)。但是,如果您需要在更新代碼之前運行遷移(例如添加新模型),則在生產中創建遷移可能會導致問題。 – Alasdair

+0

@Alasdair談論的是你應該跟蹤他們,因爲可能需要數據遷移(自定義遷移)。在某些情況下,人們手動編寫遷移以實現類似填充初始數據等操作。如果您沒有將它們保存在版本控制中,則會失去跟蹤這些步驟的情況。 –

5

遷移將數據庫的狀態與代碼的狀態同步。如果您沒有檢入到版本控制的遷移,則會丟失中間步驟。您將無法返回版本控制歷史記錄並僅運行代碼,因爲數據庫在該時間點不匹配模型。

像任何代碼一樣,遷移應該至少在基本級別上進行測試。即使它們是自動生成的,但這並不能保證它們能夠百分之百地工作。因此,安全的途徑是在您的開發環境中創建遷移,測試它們,然後將它們推送到生產環境以在那裏應用它們。

+0

你能舉個例子說明你用什麼樣的測試嗎?你檢查數據人口? – szeitlin

相關問題