2011-06-07 91 views
4

在開發過程中,我創建了許多遷移,通常來回地討論我如何實現某些東西。將多個南遷移到一個遷移

現在是時候將它推到生產環境中,但是當重播處女數據庫上的所有遷移時我遇到了錯誤。

我最終做了以下工作。

python manage.py syncdb --all 
python manage.py migrate --fake 

但是,這不會應用我創建的數據遷移。

經過進一步思考,我決定將所有的遷移工作都壓縮到一個,當我準備將其標記爲發佈版本時。

我該怎麼做?如果不可能/建議,那麼最佳方法是什麼?

回答

4

這是可能的,我自己做了幾次。你基本上有兩種方法:

1)這是迄今爲止最簡單和首選的方法。簡單地說,將您的開發數據庫回滾到您希望包含在「壓扁」中的第一個遷移之前,然後刪除其中的所有遷移。最後,重新運行schemamigration管理命令。您將最終在一個文件中完成所有必要的遷移。 2)如果由於某種原因你不能做#1,它在技術上仍然是可能的,但是對程序的要求會更高。將每次遷移的向前和向後方法的內容直接複製並粘貼到一個遷移文件(最低編號的文件)中。這部分很容易,但是您還必須對文件底部的凍結模型進行手動修改。我發現最好的方法是簡單地嘗試運行這個新的遷移。你很可能會得到關於這樣的模型的錯誤,沒有任何屬性等等。這是將信息添加到凍結模型的一個信號。當遷移無誤地運行時,您是黃金。

注意:請記住,當您刪除這些舊的遷移文件時,請使用您正在使用的任何版本控制系統刪除它們。換句話說,使用git rmsvn rm等。如果您最終在發佈中添加了這些舊的遷移標記,那麼您將生成實例。就我而言,在我準備好發佈我的更改之前,我從不提交遷移。如果你失去它,你總是可以重新生成遷移。

+2

我自己做了#1。運作良好,但#2聽起來很棒。無法想象它比僅僅不壓縮它們更好。 – mlissner 2011-07-12 07:02:46

+0

我只是好奇而已。如果我使用#1併爲所有現有遷移執行此操作,本質上我將刪除並重新創建數據庫,然後運行'./manage.py makemigrations'。團隊中的其他開發人員是否也需要刪除他們的數據庫?或者它會無縫工作? – oloo 2014-10-11 16:05:32

0

你試過刪除所有遷移,然後做./manage.py schemamigration myapp --init

請記住,這打破依賴於這些遷移的任何東西,所以只有在你還沒有生產時才能做到。

1

有一個command in the django manage.py specifically for this。如果您正在使用Migrations作爲燈具,如果您不想擠壓燈具,則可能需要在某些Migrations中擺弄依賴項屬性。

如果沒有燈具,只是想壁球從可以運行所有遷移:

python manage.py squashmigrations app_name 0001 

哪裏APP_NAME是你的應用程序的名稱,0001是要擠出空位遷移。

查看上面鏈接的文檔以獲取更多信息。

+4

請注意,這與Django> = 1.7一起使用,並具有內置的遷移系統。這個問題最初是針對南方的。 – 2015-03-25 08:16:29