前言
隨着項目需求的增加:
- Django的遷移文件越來越大,
- 並且遇到models文件中如果使用了自定義存儲字段。不再使用後刪除會報錯的情況。
重置遷移文件後解決了上述問題。
情景一:不需要原有的數據庫數據
- 首先刪除數據庫中的相關APP下的數據表
- 然後刪除APP下的migration模塊中的所有 文件,除了init.py 文件
- 執行下面的命令
python manage.py makemigrations
python manage.py migrate
情景二:不想要刪除現有的數據庫,只是想重新建立 migration 文件
這個情況是開發中最爲常見的,也是操作起來稍微複雜一點的情況,但是隻要遵循下面的操作步驟,就不會引發任何錯誤。
- 首先要保證,目前的migration文件和數據庫是同步的,通過執行
python manage.py makemigrations
2.查看當前項目下所有APP對應的已經生效的(已經成功執行的)migration文件,命令如下:
python manage.py showmigrations
結果如下圖所示:
admin
[X] 0001_initial
[X] 0002_logentry_remove_auto_add
[X] 0003_logentry_add_action_flag_choices
api
[X] 0001_initial
contenttypes
[X] 0001_initial
[X] 0002_remove_content_type_name
explore
[X] 0001_initial
[X] 0002_auto_20200223_0131
[X] 0003_delete_exphoto
[X] 0004_exphoto
[X] 0005_auto_20200304_1652
parent
[X] 0001_initial
[X] 0002_auto_20200409_2248
- 重置你的APP的操作,使它們恢復到沒有執行的狀態,這裏注意一下fake前面的符號,是兩個“-”,另外,explore 是APP的名字。
python manage.py migrate --fake explore zero
重裝完後進行檢查:
python manage.py showmigrations
如果是要重置的APP前面[x]變成了[ ]則操作正確:
admin
[X] 0001_initial
[X] 0002_logentry_remove_auto_add
[X] 0003_logentry_add_action_flag_choices
api
[X] 0001_initial
contenttypes
[X] 0001_initial
[X] 0002_remove_content_type_name
explore
[ ] 0001_initial
[ ] 0002_auto_20200223_0131
[ ] 0003_delete_exphoto
[ ] 0004_exphoto
[ ] 0005_auto_20200304_1652
parent
[X] 0001_initial
[X] 0002_auto_20200409_2248
**這裏要注意,如果有其它數據庫的狀態有[x]變成了[ ],則該APP也要重置(因爲外鍵的原因)**如:
admin
[X] 0001_initial
[X] 0002_logentry_remove_auto_add
[X] 0003_logentry_add_action_flag_choices
api
[X] 0001_initial
contenttypes
[X] 0001_initial
[X] 0002_remove_content_type_name
explore
[ ] 0001_initial
[ ] 0002_auto_20200223_0131
[ ] 0003_delete_exphoto
[ ] 0004_exphoto
[ ] 0005_auto_20200304_1652
parent
[X] 0001_initial
[ ] 0002_auto_20200409_2248
這裏parent出現了[ ],則也應該重置,否則會報錯。
- 然後放心大膽地刪除
migrations
文件夾下面,除了__init__.py
文件,的所有的帶有序號的.py
文件,包括pycache
文件夾! - 執行下面的命令,再次爲這個APP 生成 0001_initial.py 之類的文件
python manage.py makemigrations
- 最後執行下面的命令,使剛剛生成的
0001_initial.py
文件記錄到django_migrations
數據表中,大功告成。
python manage.py migrate --fake-initial
參考資料:
Django開發—如何重置migration
Django筆記05:如何悄悄刪除migrations下的文件而不引起任何錯誤