1. 程式人生 > >Django2.0-db(11)-ORM模型遷移

Django2.0-db(11)-ORM模型遷移

ORM模型遷移

遷移命令:

  1. makemigrations:將模型生成遷移指令碼。模型所在的 app,必須放在 settings.py中的INSTALLED_APPS 中。這個命令有以下幾個常用選項:

    • [app_label]:後面可以跟一個或者多個app,那麼就只會針對這幾個app生成遷移指令碼。如果沒有任何的app_label,那麼會檢查INSTALLED_APPS中所有的app下的模型,針對每一個app都生成響應的遷移指令碼。
    • [--name]:給這個遷移指令碼指定一個名字(就是在migrations資料夾裡的名字)
    • [ --empty]:生成一個空的遷移指令碼。如果你想寫自己的遷移指令碼,可以使用這個命令來實現一個空的檔案,然後自己再在檔案中寫遷移指令碼。
  2. migrate:將新生成的遷移指令碼。對映到資料庫中。建立新的表或者修改表的結構。Django會生成一個記錄migrationname檔案的依賴表(django_migrations)

    ),在執行migrate的時候會根據該表和檔案依賴關係進行遷移(表裡有的不會再生成)以下一些常用的選項:

    • [app_label]:將某個app下的遷移指令碼對映到資料庫中。如果沒有指定,那麼會將所有在INSTALLED_APPS中的app下的模型都對映到資料庫中。
    • app_label migrationname:將某個app下指定名字的migration檔案對映到資料庫中。
    • [--fake]:可以將指定的遷移指令碼名字新增到資料庫中。但是並不會把遷移指令碼轉換為SQL語句,修改資料庫中的表。
    • [--fake-initial]:將第一次生成的遷移檔案版本號記錄在資料庫中。但並不會真正的執行遷移指令碼。
  3. showmigrations:檢視某個app下的遷移檔案。如果後面沒有app,那麼將檢視INSTALLED_APPS中所有的遷移檔案。

  4. sqlmigrate:檢視某個遷移檔案在對映到資料庫中的時候,轉換的SQL語句。

migrate怎麼判斷哪些遷移指令碼需要執行

會將程式碼種的遷移指令碼和資料庫中django_migrations中的遷移腳進行對比,如果發現數據庫中沒有這個遷移指令碼(django_migrations表),那麼就會執行這個遷移指令碼。

migrate做了什麼

  1. 將相關的遷移指令碼翻譯成sql語句,在資料庫中執行這個sql語句
  2. 如果這個sql語句執行沒有問題,那麼就會將這個遷移指令碼的名字記錄到django_migrations

migrations中的遷移版本和資料庫中的遷移版本對不上怎麼辦?

  1. 找到哪裡不一致,然後使用python manage.py --fake [版本名字],將這個版本標記為已經對映。
  2. 刪除指定appmigrations和資料庫表django_migrations中和這個app相關的版本號,然後將模型中的欄位和資料庫中的欄位保持一致,再使用命令python manage.py makemigrations重新生成一個初始化的遷移指令碼,之後再使用命令python manage.py makemigrations --fake-initial來將這個初始化的遷移指令碼標記為已經對映。以後再修改就沒有問題了。

另外一個筆記版本

原因

執行migrate命令會報錯的原因是:資料庫中的django_migrations表中的遷移版本記錄和程式碼種的遷移指令碼不一致導致的。

解決方法

使用[--fake]引數

首先對比資料庫中的遷移指令碼和程式碼中的遷移指令碼。然後找到哪個不同,之後再使用--fake,將程式碼種的遷移指令碼資訊新增到django_migrations表中,但是不會執行sql語句。這樣就可以避免每次執行migrate的時候,都執行一些重複的遷移指令碼。

最後解決方案

如果程式碼中的遷移指令碼和資料庫中的遷移指令碼實在太多,無法搞清楚使用。

  1. 原理: 將之前的哪些遷移指令碼剔除,重新來過。將出問題的app下的所有模型和資料庫中表保持一致,來重新對映。
  2. 將出問題的app下所有模型,和資料庫中的表保持一致。
  3. 將出問題的app下的所有遷移指令碼檔案都刪掉。在資料庫中的django_migration表中將出問題的app相關的遷移記錄都刪除掉。
  4. 使用makemigrations,重新將模型生成一個遷移指令碼。
  5. 使用mirate --fake-initial引數,將剛剛生成的遷移指令碼,標記為已經完成(因為這些模型對應的表已經在資料庫中存在,無需重新對映)
  6. 完成。可以執行其他的映射了、