Ответ
Рассинхронизация миграций в 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
Ключевая рекомендация: перед созданием новой миграции всегда синхронизируйтесь с основной веткой разработки, чтобы избежать конфликтов.