Ответ
Рассинхронизация миграций в Django — это ситуация, когда состояние базы данных не соответствует файлам миграций в кодовой базе. Это частая проблема при командной разработке, приводящая к серьезным ошибкам.
Основные проблемы:
-
Ошибки при выполнении
migrate
Попытка применить миграцию, которая зависит от еще не примененной (например, из другой ветки), вызовет ошибкуInconsistentMigrationHistory
. -
Несогласованное состояние БД (Inconsistent State) В базе данных могут отсутствовать таблицы или столбцы, которые уже ожидает использовать код приложения. Это приводит к ошибкам
OperationalError
(например,no such table
илиno such column
) во время выполнения. -
Конфликты миграций (Migration Conflicts) Два разработчика в разных ветках могут создать миграции с одинаковыми порядковыми номерами (например,
0002_...
). При слиянии веток Django не сможет определить правильный порядок их применения.
Диагностика и решение
-
Проверка статуса Команда покажет, какие миграции применены (
[X]
), а какие нет ([ ]
).python manage.py showmigrations
-
Разрешение конфликтов Если возник конфликт одинаковых номеров, Django предложит объединить их. Для этого используется команда:
python manage.py makemigrations --merge
-
Применение или откат
- Для применения всех недостающих миграций:
python manage.py migrate
- Для отката к конкретной миграции:
python manage.py migrate app_name <migration_name>
- Для применения всех недостающих миграций:
-
"Фейковое" применение Используется, если изменения в БД уже были внесены вручную, но Django об этом не знает. Команда помечает миграцию как примененную без реального выполнения SQL-запросов.
python manage.py migrate --fake
Ключевая рекомендация: перед созданием новой миграции всегда синхронизируйтесь с основной веткой разработки, чтобы избежать конфликтов.