Как Django отслеживает примененные миграции?

«Как Django отслеживает примененные миграции?» — вопрос из категории Django, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Django отслеживает примененные миграции с помощью специальной таблицы в базе данных под названием django_migrations.

Ключевые моменты:

  1. Таблица django_migrations Эта таблица создается автоматически при первом запуске команды python manage.py migrate. Она содержит запись для каждой успешно примененной миграции.

    Ее структура проста:

    • id: Первичный ключ.
    • app: Название приложения, к которому относится миграция.
    • name: Имя файла миграции (например, 0001_initial).
    • applied: Дата и время применения миграции.
  2. Процесс работы команды migrate Когда вы запускаете python manage.py migrate, Django выполняет следующие шаги:

    • Сканирует директории migrations/ всех приложений проекта и находит все файлы миграций.
    • Сравнивает найденный список миграций со списком миграций, записанных в таблице django_migrations.
    • Определяет, какие миграции еще не были применены.
    • Выполняет SQL-команды для каждой непримененной миграции в правильном порядке (учитывая зависимости).
    • После успешного выполнения каждой миграции добавляет новую запись в таблицу django_migrations.

Практическая проверка статуса

Самый простой способ проверить, какие миграции применены, а какие нет — использовать команду showmigrations:

# Показать статус миграций для всех приложений
python manage.py showmigrations

# Показать статус для конкретного приложения
python manage.py showmigrations my_app

Вывод команды помечает примененные миграции символом [X]:

my_app
 [X] 0001_initial
 [X] 0002_add_price_field
 [ ] 0003_add_tags

Таким образом, таблица django_migrations является единственным источником правды о состоянии схемы базы данных с точки зрения Django.