W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
我們鼓勵(lì)你自由地進(jìn)行遷移,而不要擔(dān)心你有多少遷移;遷移代碼經(jīng)過優(yōu)化,可以一次處理幾百個(gè)遷移,而不會(huì)有太多的減速。然而,最終你會(huì)希望從幾百個(gè)遷移回歸到只有幾個(gè),這就是壓縮的作用。
壓縮是將一組現(xiàn)有的多個(gè)遷移減少到一個(gè)(有時(shí)是幾個(gè))遷移,這些遷移仍然代表相同的更改。
Django通過獲取所有現(xiàn)有遷移,提取它們的 ?Operation
?并將它們按順序排列,然后對(duì)它們運(yùn)行一個(gè)優(yōu)化器,以嘗試減少列表的長(zhǎng)度——例如,它知道 ?CreateModel
?和 ?DeleteModel
?相互抵消,它還知道 ?AddField
?可以卷入 ?CreateModel
?。
一旦操作序列被盡可能地減少——可能的數(shù)量取決于你的模型有多緊密交織,如果你有任何 RunSQL 或 RunPython 操作(除非它們被標(biāo)記為 ?elidable
?,否則無法被優(yōu)化),Django就會(huì)把它寫回一組新的遷移文件中。
這些文件被標(biāo)記為替換了先前壓縮的遷移,因此它們可以與舊遷移文件共存,Django 將根據(jù)你在歷史記錄中的位置智能地在它們之間切換。如果你仍處于壓縮過程中,則它將繼續(xù)使用它們直到結(jié)束,然后切換到壓縮歷史記錄,而新安裝將使用新壓縮后的遷移并跳過所有舊遷移。
這樣你就可以壓縮而不至于把目前還沒有完全更新的生產(chǎn)系統(tǒng)搞亂。推薦的流程是壓縮,保留舊文件,提交并發(fā)布,等到所有系統(tǒng)都升級(jí)到新版本(或者如果你是第三方項(xiàng)目,確保你的用戶按順序升級(jí)版本,不跳過任何一個(gè)版本),然后刪除舊文件,提交并進(jìn)行第二次發(fā)布。
支持這一切的命令是 ?squashmigrations
?——把你想壓縮的應(yīng)用標(biāo)簽和遷移名稱傳給它,它就會(huì)開始工作:
$ ./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è)置壓縮遷移的名稱而不是使用自動(dòng)生成的遷移名稱,請(qǐng)使用 ?squashmigrations --squashed-name
? 選項(xiàng)。
請(qǐng)注意,Django 中的模型相互依賴可能會(huì)變得非常復(fù)雜,壓縮可能會(huì)導(dǎo)致遷移無法運(yùn)行;要么是優(yōu)化錯(cuò)誤(在這種情況下,你可以用 ?--no-optimize
? 再試一次,不過你也應(yīng)該報(bào)告這個(gè)問題),要么是 ?CircularDependencyError
?,在這種情況下,你可以手動(dòng)解決它。
要手動(dòng)解決 ?CircularDependencyError
?問題,請(qǐng)將循環(huán)依賴中的外鍵分離到單獨(dú)的遷移中,并將依賴項(xiàng)移到另一個(gè)應(yīng)用上。如果你不確定,請(qǐng)參見 ?makemigrations
?在被要求從模型創(chuàng)建全新的遷移時(shí)如何處理問題。在未來的 Django 版本中,?squashmigrations
?將被更新以嘗試自己解決這些錯(cuò)誤。
一旦你壓縮了你的遷移,你應(yīng)該把它和它所替代的遷移一起提交,并把這個(gè)更改分發(fā)到你的應(yīng)用程序的所有運(yùn)行中的實(shí)例,確保它們運(yùn)行 ?migrate
?來將更改存儲(chǔ)在它們的數(shù)據(jù)庫中。
然后,你必須通過以下方法將壓縮的遷移過渡到正常遷移:
Migration
?類的 ?replaces
?屬性(這就是 Django 告訴它是壓縮遷移的方式)。壓縮遷移后,在完全將其轉(zhuǎn)換為正常遷移之前,你不應(yīng)該再重新壓縮該壓縮的遷移。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: