Короткий ответ
Миграция — это версионированный, воспроизводимый набор инструкций, который переводит схему БД из одного состояния в другое; миграции нужны, чтобы изменения моделей в коде синхронизированно и повторяемо применялись к реальной БД на всех окружениях и у всех разработчиков.
Как это работает подробнее
Инструмент миграций (Alembic для SQLAlchemy, встроенный механизм Django) сравнивает текущее состояние моделей с историей уже применённых миграций и генерирует/хранит файлы с операциями; каждая миграция применяется по порядку и помечается как выполненная в специальной таблице в БД.
Пример кода
Сценарий
# Django
python manage.py makemigrations # генерирует файл миграции на основе изменений моделей
python manage.py migrate # применяет непримененные миграции к БД
# Alembic (SQLAlchemy)
alembic revision --autogenerate -m "add phone to users"
alembic upgrade headЧто использовать на практике
- Практика. Миграции хранят в репозитории рядом с кодом и применяют как часть процесса деплоя; важно, чтобы миграция была воспроизводима на чистой БД и откатываема (downgrade), когда это возможно.
Подводные камни
- Ошибка. Правят схему БД руками напрямую в production, минуя миграции, из-за чего состояние БД расходится с историей миграций; коммитят модель без соответствующей миграции, из-за чего ORM и реальная БД не совпадают.