django migrate流程及相關檔案
阿新 • • 發佈:2021-02-13
技術標籤:django
一. python manage.py makemigrations
#在對應app下生成遷移檔案
一般情況下,makemigrations 流程大概分成以下幾個步驟:
- 建立 MigrationLoader 物件,載入 migration 檔案,生成 MigrationGraph 物件(簡單情況下是一組 migration 物件列表)
- 根據 models 定義,創建出 Project State
- 根據 MigrationGraph 物件創建出 Database State
- 建立 MigrationAutodetector 物件來比對 Database State 和 Project State 之間的差異
- 生成新的 Migration 物件
- 將 Migration 物件寫入到新的 migration 指令碼中
一句話總結:makemigrations時根據現有model資訊 對比 本地migrations目錄下的檔案,根據差異建立新的migration檔案;後一個檔案會依賴前一個檔案
from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ ('artifact', '0002_platformmsgx'), ] operations = [ migrations.CreateModel( name='VersionSyn', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('region_id', models.CharField(max_length=50, verbose_name='區域ID')), ('product_ename', models.CharField(max_length=255, verbose_name='專案ID')), ('product_version', models.CharField(max_length=50, verbose_name='版本號')), ('syn_region', models.CharField(max_length=255, verbose_name='同步物件區域ID')), ('syn_ename', models.CharField(max_length=255, verbose_name='同步物件專案ID')), ('syn_version', models.CharField(max_length=50, verbose_name='同步物件版本號')), ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='建立時間')), ], options={ 'verbose_name': '版本同步記錄', 'verbose_name_plural': '版本同步記錄', 'db_table': 'version_syn', }, ), ]
由上可知:
migration檔案中Migration類下存在屬性
dependencies -- 本檔案的依賴檔案
operations -- 本文的操作內容
二. python manage.py migrate
#根據遷移檔案執行遷移
migrate命令執行時Django會做4件事:
- 遷移判定,將你的專案中所有未遷移的變動檔案進行遷移(Django會去查詢django_migrations表判斷你是否有新的遷移變動)再完成接下來的遷移後,便會在該表中生成一條遷移記錄。
- 遷移對映關係django_contenttype表新增對映關係(app與模型關係)。
- 遷移許可權auth_permission表新增許可權。
- 執行遷移,生成資料表,或變動。
migrate --fake 只執行第一步,並生成遷移記錄,忽略資料庫中的表不生成表。
migrate --fake-initial 執行前三步,不實際變動資料庫,如果有已存在的表不變動,其他繼續生成
migrate 全部依次執行所有步驟。
涉及的資料庫表格:
django_content_type #app -- model對映關係表
django_migrations # 遷移檔案執行記錄表
遷移經常會出現多種錯誤,需根據遷移流程和相關檔案進行梳理
參考: