Django筆記05:如何悄悄刪除migrations下的文件而不引起任何錯誤

當進行Django開發操作數據庫的時候,我們每一次的修改都會以文件的形式記錄在APP目錄的migrations文件夾下,但是隨着文件越來越多,這並不利於我們後期的維護,所以我們需要定期清理(重置)一下migrations文件夾,這篇文章將優雅地告訴你如何如何悄悄刪除migrations下的文件而不引起任何錯誤!

1.不考慮數據表的情況

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

2.保留原有數據表的情況

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

1.檢查migrations文件夾下面的修改記錄文件是否與數據庫保持一致,如若我們執行這個命令

python manage.py makegrations

執行結果顯示:

No changes detected

那我們就可以繼續執行下面的步驟

2.查看當前項目下所有APP對應的已經生效的(已經成功執行的)migration文件,命令如下:

python manage.py showmigrations

結果如下圖所示,前面的[x]表示已經執行過的文件,如:imooc這個APP下執行過兩次操作

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
imooc
 [X] 0001_initial
 [X] 0002_auto_20190122_0929
sessions
 [X] 0001_initial

3.重置你的APP的操作,使它們恢復到沒有執行的狀態,這裏注意一下fake前面的符號,是兩個“-”,另外,imooc是APP的名字,記得將它替換成你的APP名字。還有一點就是不要直接複製,要手敲到終端纔不會因格式問題而產生錯誤。fake參數該怎樣理解呢?fake是假裝的意思,在這裏我們可以理解爲假設我們將這些操作設置爲沒有執行的狀態,而不是他們真的沒有執行!

python manage.py migrate --fake imooc zero

結果如下,則顯示重置成功

(wprkplace) D:\PythonProject\learn>python manage.py migrate --fake imooc zero
Operations to perform:
  Unapply all migrations: imooc
Running migrations:
  Rendering model states... DONE
  Unapplying imooc.0005_hua... FAKED
  Unapplying imooc.0004_xiao... FAKED
  Unapplying imooc.0003_ming... FAKED
  Unapplying imooc.0002_auto_20190122_0929... FAKED
  Unapplying imooc.0001_initial... FAKED

然後我們可以再次執行showmigrations的命令,查看一下各個操作的狀態

(wprkplace) D:\PythonProject\learn>python manage.py showmigrations
admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
 [X] 0008_alter_user_username_max_length
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
imooc
 [ ] 0001_initial
 [ ] 0002_auto_20190122_0929
 [ ] 0003_ming
 [ ] 0004_xiao
 [ ] 0005_hua
sessions
 [X] 0001_initial

可以看到imooc這個APP下面的操作全部重置爲沒有執行的狀態,[x]變成了[ ],注意是假設它沒有執行!

4.然後放心大膽地刪除migrations文件夾下面,除了__init__.py文件,的所有的帶有序號的py文件,包括pycache文件夾!

5.執行下面的命令,再次爲這個APP 生成 0001_initial.py 之類的文件

python manage.py makemigrations

提示如下則爲成功

(wprkplace) D:\PythonProject\learn>python manage.py makemigrations
Migrations for 'imooc':
  imooc\migrations\0001_initial.py:
    - Create model Hua
    - Create model Ming
    - Create model Post
    - Create model Tag
    - Create model Test
    - Create model Xiao

6.執行下面的命令,使剛剛生成的0001_initial.py文件記錄到django_migrations數據表中,這個表是django自動生成的,用於記錄每次執行的數據庫修改操作,表中有四個字段,name和app是對應的關係,意爲某某APP下的某某操作。

python manage.py migrate --fake-initial

結果如下即爲成功

(wprkplace) D:\PythonProject\learn>python manage.py migrate --fake-initial
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, imooc, sessions
Running migrations:
  Applying imooc.0001_initial... FAKED

如果你再去看一下django_migrations這個表,你會發現這個表添加了一條記錄,一般來說如果我們真的執行了數據庫的修改操作纔會生成這樣一條記錄,但是我們用了fake這個“假裝”的操作,所以其實僅僅是添加了一條記錄而已,並沒有實際修改數據表,也就是這樣,完成了migrations文件夾的重置!

參考資料

https://blog.csdn.net/zhuoxiuwu/article/details/52167599

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