原因:
執行migrate命令會報錯的原因是:數據庫的'django_migrations'表中的遷移版本記錄和代碼中的遷移腳本不一致的。
解決方法:
使用--fake參數
首先對比數據庫中的遷移腳本和代碼中的遷移腳本。然后找到哪個不同,之后再使用'--fake',將代碼中的遷移腳本添加到'django_migrations'數據庫中,但是並不會執行sql語句。這樣就可以避免每次執行'migrate'的時候,都執行一些重復的遷移腳本。
終極解決方案:
如果代碼中的遷移腳本和數據庫中的遷移腳本實在太多,就是搞不清了。那么這時候就可以使用終極解決方案:
1、終極解決方案的原理:將之前的那些遷移腳本都不用了,重新來過。將出問題的app下的所有模型和數據庫中表保持一致,重新映射。
2、將出問題的app下的所有模型,都和數據庫中的表保持一致。
3、將出問題的app下的所有遷移腳本文件都刪除,再將'django_migrations'表中將出問題的app相關的遷移記錄都刪掉。
4、使用'makemigrations',重新將模型生成一個遷移腳本。
5、使用'migrate --fake-initial'參數,將剛剛生成的遷移腳本,標記為已經完成(因為這些模型相對應的表,其實都已經在數據庫中存在了,不需要重復執行了)
6、可以做其他的映射了。
補充:
migrate怎么判斷哪些遷移腳本需要執行:
他會將代碼中的遷移腳本和數據庫中'django_migrations'中的遷移腳本進行對比,如果發現數據庫中,沒有這個遷移腳本,那么就會執行這個遷移腳本。
migrate做了什么事情:
1、將相關的遷移腳本翻譯成sql語句,在數據庫中執行這個sql語句。
2、如果這個sql語句執行沒有問題,那么就會將這個遷移腳本的名字記錄到'django_migrations'中。