Django數據庫操作 —— 乾淨的重置migration

前言

隨着項目需求的增加:

  • Django的遷移文件越來越大,
  • 並且遇到models文件中如果使用了自定義存儲字段。不再使用後刪除會報錯的情況。

重置遷移文件後解決了上述問題。

情景一:不需要原有的數據庫數據

  1. 首先刪除數據庫中的相關APP下的數據表
  2. 然後刪除APP下的migration模塊中的所有 文件,除了init.py 文件
  3. 執行下面的命令
python manage.py makemigrations
python manage.py migrate

情景二:不想要刪除現有的數據庫,只是想重新建立 migration 文件

這個情況是開發中最爲常見的,也是操作起來稍微複雜一點的情況,但是隻要遵循下面的操作步驟,就不會引發任何錯誤。

  1. 首先要保證,目前的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
  1. 重置你的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出現了[ ],則也應該重置,否則會報錯。

  1. 然後放心大膽地刪除migrations文件夾下面,除了__init__.py文件,的所有的帶有序號的.py文件,包括pycache文件夾!
  2. 執行下面的命令,再次爲這個APP 生成 0001_initial.py 之類的文件
python manage.py makemigrations
  1. 最後執行下面的命令,使剛剛生成的0001_initial.py文件記錄到django_migrations數據表中,大功告成。
python manage.py migrate --fake-initial

參考資料:

Django開發—如何重置migration
Django筆記05:如何悄悄刪除migrations下的文件而不引起任何錯誤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章