1. 程式人生 > >django遷移未檢測到更新的錯誤的解決方案

django遷移未檢測到更新的錯誤的解決方案

有時候你刪除了django專案中app檔案的migrations檔案之後,想要重新進行遷移,這時候你輸入python manage.py makemigrations appname,發現沒有問題,然後你執行python manage.py migrate結果發現沒有檢測到遷移改變,你就會很納悶,為什麼我命名遷移了檔案,在將遷移檔案應用到資料庫的時候卻沒有檢測到遷移呢?這裡就需要我們瞭解一下django進行遷移的原理。

原理:django在進行遷移的時候會事先在sqlite3資料庫中的django_migrations表單中查詢這一次遷移的名稱,例如0001_initial.py,如果發現有同名的檔名,就認為這一次的遷移它已經做過了,就不會更新了!

那麼針對上述的情況有什麼好的解決辦法嗎?

我的解決思路是先刪除django_migrations中帶有appname的條目(列名為app)然後重新進行遷移(沒有更新之前的版本),遷移的時候新增引數--fake,即僅做一次假遷移,不真的修改資料庫,之後再將模型檔案Models.py更新到新版本,然後再生成一個0002開頭的遷移檔案,之後再做正常的更新就可以解決了!

接下來我們來展示一下實際操作過程:

  • 進入到python中,匯入sqlite3
import sqlite3
conn = sqlite3.connect('db.sqlite3')
conn.execute('select * from django_migrations').fetchall()#檢視該表的內容
conn.execute('delete from django_migrations where app="appname"')#刪除和該app有關的行
conn.commit()

這裡需要注意的是在刪除的時候必須要指定列名,也就是欄位名app,如果不指定的話是不會刪除的,而且也不會有報錯!

  • 刪除之後我們就可以進行一次原有版本的假更新了,這裡為什麼要強調是原有版本呢,就是說,這一次遷移僅僅是在django_migrations中新增該次更新的記錄,不會對資料庫增刪表格,所以已經搭建好的表格應該是和現在這次假更新的模型相對應的。現在我們就可以進行假更新了
python manage.py makemigrations appname
python manage.py migrate --fake
  • 現在,我們就可以更新models.py到我們想要更新的內容,然後進行正常的遷移了!
python manage.py makemigrations appname
python manage.py migrate