解決Django makemigrations 時的NodeNotFoundError 及 其它遷移問題
migrate命令執行時Django會做4件事:
1、遷移判定,將你的項目中所有未遷移的變動文件進行遷移(django會去查詢django_migrations表判斷你是否有新的遷移變動),在完成接下來的遷移后,便會在該表中生成一條遷移記錄。
2、遷移映射關系 django_contenttype表新增映射關系(app與模型關系)
3、遷移權限 auth_permission表新增權限
4、執行遷移,生成數據表,或變動
migrate --fake 只執行第一步,並生成遷移記錄。
migrate --fake-initial 執行前三步,不實際變動數據庫
migrate 全部依次執行所有步驟。
當django 環境變了時,原其他環境下的項目不能正常運行,需要進行修改。
常見問題有:
1、首先需要修改url 的方法
2、當執行數據遷移命令時會發生報錯,具體報錯信息如下:
# 我只截取了最近的報錯內容
Traceback (most recent call last):
File "D:\Python368x64\Lib\site-packages\django\db\migrations\graph.py", line 195, in <listcomp>
[n.raise_error() for n in self.node_map.values() if isinstance(n, DummyNode)]
File "D:\Python368x64\Lib\site-packages\django\db\migrations\graph.py", line 58, in raise_error
raise NodeNotFoundError(self.error_message, self.key, origin=self.origin)
django.db.migrations.exceptions.NodeNotFoundError: Migration auth.0012_user_following dependencies reference nonexistent parent node ('account', '0002_contact')
此時新建項目時,執行數據庫遷移命令時,可能也會出現該類似問題,這是django的migrations殘留了歷史對應的遷移數據,這個是 django自身的App造成的,如:admin和 auth應用。因此需要根據報錯信息,手動去操作 migrations文件中清除對應的遷移數據文件。
注意:如果提示數據庫中有表已存在,可以首先將數據庫的表遷移出來再進行刪除,或者嘗試使用命令:
python3 manage.py migrate --fake
可以嘗試以下具體操作如下:
1、通過本地的python3.8文件下查詢路徑進行刪除:
2、刪除確定出錯的遷移文件,在這里就是最后一個0012開頭的文件。
3、刪除之后重新執行 python3 manage.py makemigrations
4、執行 python3 manage.py migrate
此時遷移操作應該可以正常了。
注:也可以通過pycharm項目下的庫進行查找進行刪除,路徑同上。很方便查找以及操作。
如果出現其他關於數據遷移問題,也可以通過暴力刪除方式解決(當然不要刪數據庫中的數據)。
具體操作如下:
1、首先刪除項目中的 migrations.py 文件中的記錄
2、去Python庫中,刪除admin應用和 auth應用下的migrations歷史數據
#具體路徑:
python3.6--->site-packages--->django--->contrib--->admin(和auth)-->migrations
3、重新執行數據庫遷移命令,此方法應該可以解決大部分數據庫遷移問題。
