Django2.0-db(11)-ORM模型遷移
阿新 • • 發佈:2018-12-20
ORM模型遷移
遷移命令:
-
makemigrations
:將模型生成遷移指令碼。模型所在的app
,必須放在settings.py
中的INSTALLED_APPS
中。這個命令有以下幾個常用選項:[app_label]
:後面可以跟一個或者多個app
,那麼就只會針對這幾個app生成遷移指令碼。如果沒有任何的app_label,那麼會檢查INSTALLED_APPS
中所有的app下的模型,針對每一個app都生成響應的遷移指令碼。[--name]
:給這個遷移指令碼指定一個名字(就是在migrations
資料夾裡的名字)[ --empty]
:生成一個空的遷移指令碼。如果你想寫自己的遷移指令碼,可以使用這個命令來實現一個空的檔案,然後自己再在檔案中寫遷移指令碼。
-
migrate
:將新生成的遷移指令碼。對映到資料庫中。建立新的表或者修改表的結構。Django會生成一個記錄migrationname檔案的依賴表(django_migrations
)),在執行migrate的時候會根據該表和檔案依賴關係進行遷移(表裡有的不會再生成)以下一些常用的選項:
[app_label]
:將某個app
下的遷移指令碼對映到資料庫中。如果沒有指定,那麼會將所有在INSTALLED_APPS
中的app
下的模型都對映到資料庫中。app_label migrationname
:將某個app
下指定名字的migration
檔案對映到資料庫中。[--fake]
:可以將指定的遷移指令碼名字新增到資料庫中。但是並不會把遷移指令碼轉換為SQL語句,修改資料庫中的表。[--fake-initial]
:將第一次生成的遷移檔案版本號記錄在資料庫中。但並不會真正的執行遷移指令碼。
-
showmigrations
:檢視某個app下的遷移檔案。如果後面沒有app,那麼將檢視INSTALLED_APPS
中所有的遷移檔案。 -
sqlmigrate
:檢視某個遷移檔案在對映到資料庫中的時候,轉換的SQL
語句。
migrate怎麼判斷哪些遷移指令碼需要執行
會將程式碼種的遷移指令碼和資料庫中django_migrations
中的遷移腳進行對比,如果發現數據庫中沒有這個遷移指令碼(django_migrations
表),那麼就會執行這個遷移指令碼。
migrate做了什麼
- 將相關的遷移指令碼翻譯成sql語句,在資料庫中執行這個sql語句
- 如果這個sql語句執行沒有問題,那麼就會將這個遷移指令碼的名字記錄到
django_migrations
中
migrations中的遷移版本和資料庫中的遷移版本對不上怎麼辦?
- 找到哪裡不一致,然後使用
python manage.py --fake [版本名字]
,將這個版本標記為已經對映。 - 刪除指定
app
下migrations
和資料庫表django_migrations
中和這個app
相關的版本號,然後將模型中的欄位和資料庫中的欄位保持一致,再使用命令python manage.py makemigrations
重新生成一個初始化的遷移指令碼,之後再使用命令python manage.py makemigrations --fake-initial
來將這個初始化的遷移指令碼標記為已經對映。以後再修改就沒有問題了。
另外一個筆記版本
原因
執行migrate命令會報錯的原因是:資料庫中的django_migrations
表中的遷移版本記錄和程式碼種的遷移指令碼不一致導致的。
解決方法
使用[--fake]
引數
首先對比資料庫中的遷移指令碼和程式碼中的遷移指令碼。然後找到哪個不同,之後再使用--fake
,將程式碼種的遷移指令碼資訊新增到django_migrations
表中,但是不會執行sql語句。這樣就可以避免每次執行migrate
的時候,都執行一些重複的遷移指令碼。
最後解決方案
如果程式碼中的遷移指令碼和資料庫中的遷移指令碼實在太多,無法搞清楚使用。
- 原理: 將之前的哪些遷移指令碼剔除,重新來過。將出問題的app下的所有模型和資料庫中表保持一致,來重新對映。
- 將出問題的app下所有模型,和資料庫中的表保持一致。
- 將出問題的app下的所有遷移指令碼檔案都刪掉。在資料庫中的
django_migration
表中將出問題的app相關的遷移記錄都刪除掉。 - 使用
makemigrations
,重新將模型生成一個遷移指令碼。 - 使用
mirate --fake-initial
引數,將剛剛生成的遷移指令碼,標記為已經完成(因為這些模型對應的表已經在資料庫中存在,無需重新對映) - 完成。可以執行其他的映射了、