Django4.0 遷移-壓縮遷移

2022-03-16 17:50 更新

我們鼓勵你自由地進行遷移,而不要擔(dān)心你有多少遷移;遷移代碼經(jīng)過優(yōu)化,可以一次處理幾百個遷移,而不會有太多的減速。然而,最終你會希望從幾百個遷移回歸到只有幾個,這就是壓縮的作用。

壓縮是將一組現(xiàn)有的多個遷移減少到一個(有時是幾個)遷移,這些遷移仍然代表相同的更改。

Django通過獲取所有現(xiàn)有遷移,提取它們的 ?Operation ?并將它們按順序排列,然后對它們運行一個優(yōu)化器,以嘗試減少列表的長度——例如,它知道 ?CreateModel ?和 ?DeleteModel ?相互抵消,它還知道 ?AddField ?可以卷入 ?CreateModel?。

一旦操作序列被盡可能地減少——可能的數(shù)量取決于你的模型有多緊密交織,如果你有任何 RunSQL 或 RunPython 操作(除非它們被標(biāo)記為 ?elidable?,否則無法被優(yōu)化),Django就會把它寫回一組新的遷移文件中。

這些文件被標(biāo)記為替換了先前壓縮的遷移,因此它們可以與舊遷移文件共存,Django 將根據(jù)你在歷史記錄中的位置智能地在它們之間切換。如果你仍處于壓縮過程中,則它將繼續(xù)使用它們直到結(jié)束,然后切換到壓縮歷史記錄,而新安裝將使用新壓縮后的遷移并跳過所有舊遷移。

這樣你就可以壓縮而不至于把目前還沒有完全更新的生產(chǎn)系統(tǒng)搞亂。推薦的流程是壓縮,保留舊文件,提交并發(fā)布,等到所有系統(tǒng)都升級到新版本(或者如果你是第三方項目,確保你的用戶按順序升級版本,不跳過任何一個版本),然后刪除舊文件,提交并進行第二次發(fā)布。

支持這一切的命令是 ?squashmigrations?——把你想壓縮的應(yīng)用標(biāo)簽和遷移名稱傳給它,它就會開始工作:

$ ./manage.py squashmigrations myapp 0004
Will squash the following migrations:
 - 0001_initial
 - 0002_some_change
 - 0003_another_change
 - 0004_undo_something
Do you wish to proceed? [yN] y
Optimizing...
  Optimized from 12 operations to 7 operations.
Created new squashed migration /home/andrew/Programs/DjangoTest/test/migrations/0001_squashed_0004_undo_something.py
  You should commit this migration but leave the old ones in place;
  the new migration will be used for new installs. Once you are sure
  all instances of the codebase have applied the migrations you squashed,
  you can delete them.

如果要設(shè)置壓縮遷移的名稱而不是使用自動生成的遷移名稱,請使用 ?squashmigrations --squashed-name? 選項。
請注意,Django 中的模型相互依賴可能會變得非常復(fù)雜,壓縮可能會導(dǎo)致遷移無法運行;要么是優(yōu)化錯誤(在這種情況下,你可以用 ?--no-optimize? 再試一次,不過你也應(yīng)該報告這個問題),要么是 ?CircularDependencyError?,在這種情況下,你可以手動解決它。
要手動解決 ?CircularDependencyError ?問題,請將循環(huán)依賴中的外鍵分離到單獨的遷移中,并將依賴項移到另一個應(yīng)用上。如果你不確定,請參見 ?makemigrations ?在被要求從模型創(chuàng)建全新的遷移時如何處理問題。在未來的 Django 版本中,?squashmigrations ?將被更新以嘗試自己解決這些錯誤。
一旦你壓縮了你的遷移,你應(yīng)該把它和它所替代的遷移一起提交,并把這個更改分發(fā)到你的應(yīng)用程序的所有運行中的實例,確保它們運行 ?migrate ?來將更改存儲在它們的數(shù)據(jù)庫中。
然后,你必須通過以下方法將壓縮的遷移過渡到正常遷移:

  • 刪除它替換的所有遷移文件。
  • 將所有依賴被刪除遷移的遷移更新為依賴被壓縮的遷移。
  • 刪除壓縮遷移的 ?Migration ?類的 ?replaces ?屬性(這就是 Django 告訴它是壓縮遷移的方式)。

壓縮遷移后,在完全將其轉(zhuǎn)換為正常遷移之前,你不應(yīng)該再重新壓縮該壓縮的遷移。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號