1. 程式人生 > 其它 >django migrate流程及相關檔案

django migrate流程及相關檔案

技術標籤:django

一. python manage.py makemigrations

#在對應app下生成遷移檔案

一般情況下,makemigrations 流程大概分成以下幾個步驟:

  1. 建立 MigrationLoader 物件,載入 migration 檔案,生成 MigrationGraph 物件(簡單情況下是一組 migration 物件列表)
  2. 根據 models 定義,創建出 Project State
  3. 根據 MigrationGraph 物件創建出 Database State
  4. 建立 MigrationAutodetector 物件來比對 Database State 和 Project State 之間的差異
  5. 生成新的 Migration 物件
  6. 將 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件事:

  1. 遷移判定,將你的專案中所有未遷移的變動檔案進行遷移(Django會去查詢django_migrations表判斷你是否有新的遷移變動)再完成接下來的遷移後,便會在該表中生成一條遷移記錄。
  2. 遷移對映關係django_contenttype表新增對映關係(app與模型關係)。
  3. 遷移許可權auth_permission表新增許可權。
  4. 執行遷移,生成資料表,或變動。

migrate --fake 只執行第一步,並生成遷移記錄,忽略資料庫中的表不生成表。
migrate --fake-initial 執行前三步,不實際變動資料庫,如果有已存在的表不變動,其他繼續生成
migrate 全部依次執行所有步驟。

涉及的資料庫表格:

django_content_type #app -- model對映關係表

django_migrations # 遷移檔案執行記錄表

遷移經常會出現多種錯誤,需根據遷移流程和相關檔案進行梳理

參考:

https://www.jianshu.com/p/0d1f39317857

https://zhuanlan.zhihu.com/p/50862931