2016-10-13 67 views
10

在Django的遷移代碼中,有一個squashmigrations命令:「如果可能,將app_label直到幷包括migration_name的遷移壓縮到更少的遷移中。」如何擠壓最近的Django遷移?

所以,如果你想擠壓前5次遷移,這將有所幫助。

什麼是最好的方式來壓扁開始與特定migration_name

在我目前正在開發的一個項目中,我們添加了5-10個新的遷移文件,因爲我們添加了新功能。我們將立即部署整個項目,看起來像單獨運行這些項目需要很長時間。我想將這個項目的所有遷移壓縮到一個遷移中,並測試運行該遷移的時間。

+0

更新 - 壓扁和測試後,花了太長時間。其中很大一部分是因爲對於我添加的每一列,MySQL都會複製整個表格,添加列,然後重命名錶格。我使用'sqlmigrate'來查看將要運行的SQL,並將四個獨立的ALTER TABLE語句合併爲四個ADD COLUMN部分,並使用帶有'state_operations'參數的'migrations.RunSQL'運行此操作,以保持遷移狀態邏輯的快樂。 –

回答

18
python manage.py squashmigrations <appname> <squashfrom> <squashto> 

python manage.py help squashmigrations 

https://docs.djangoproject.com/en/dev/topics/migrations/#migration-squashing

這會讓您更細緻地控制哪些遷移到壓扁,並讓您保持更清晰的提交歷史記錄。刪除+重新創建所有遷移可能會導致其他問題,例如循環依賴關係,具體取決於模型的構建方式。

+2

好的答案 - 運行Django 1.9或更新版本的_if_。可悲的是,這個項目是在1.8 –

+2

這得到了接受的答案,因爲它使用現代版本的Django原生功能。那些仍然在1.9之前的Django版本應該會看到Dan的答案。 –

6

您可以刪除遷移文件並再次運行makemigrations。如果您有使用這些的開發部署,則應該將migrate back添加到您刪除的第一個之前的那個。

此外,它可能是一個好主意,首先提交您的代碼,以防出現問題。

另外:

與此稍微複雜的是,如果有定製RunPython代碼,它不會被包括在makemigrations創建新的遷移

+0

如此明智而明顯。我也會在一個分支中做到這一點:-) –

+2

與此相關的輕微複雜情況是,如果自定義'RunPython'代碼,它將不會包含在'makemigrations'創建的新遷移中 –

+0

如果刪除選定的遷移(比如'__init__'後面的所有遷移),然後運行'makemigrations'並看到一條消息,比如'你有1個未應用的遷移(s)',你可以運行'./manage.py migrate --fake'到'fake'遷移(儘管其他團隊成員將完全遷移)。 – inostia