Схема-миграция vs дата-миграция

Миграция в Django - это файл в папке migrations, который запускается командой manage.py migrate. Django не делает различий между ними, но для удобства принято разделять миграции на два вида. Одни меняют только данные и их называют дата-миграциями. Другие изменяют саму структуру таблицы: добавляют и удаляют колонки — их называют схема-миграциями.

Схема-миграция меняет структуру базы данных — её схему. Пример:

# Generated by Django 2.0.6 on 2018-07-23 15:13

from django.db import migrations


class Migration(migrations.Migration):

    dependencies = [
        ('reviews', '0015_auto_20180723_1810'),
    ]

    operations = [
        migrations.RemoveField(
            model_name='enhancement',
            name='completed_by',
        ),
        migrations.RemoveField(
            model_name='enhancement',
            name='review',
        ),
        migrations.DeleteModel(
            name='Enhancement',
        ),
    ]

Дата-миграция изменяет только данные. Пример:

from django.db import migrations


def copy_teaser_text_to_md_field(apps, schema_editor):
    Lesson = apps.get_model('challenges', 'Lesson')
    for lesson in Lesson.objects.all():
        lesson.teaser_text_md = lesson.teaser_text
        lesson.save()


class Migration(migrations.Migration):

    dependencies = [
        ('challenges', '0040_auto_20180817_1826'),
    ]

    operations = [
        migrations.RunPython(copy_teaser_text_to_md_field)
    ]

Иногда пишут смешанные миграции. Например, так может выглядеть перенос данных из текстового поля в новое, поддерживающее разметку markdown:

  1. добавить в БД markdown поле
  2. скопировать данные
  3. удалить устаревшее поле

Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.