Что такое Alembic
Что проверяют
Работали ли вы с изменением схемы в команде, а не только создавали таблицы через create_all(). Определение занимает одну фразу, дальше проверяют практику: как устроена цепочка ревизий, что умеет автогенерация и что делать, когда в main оказались две ветки миграций.
Как отвечать
Alembic это инструмент миграций для SQLAlchemy от того же автора. В FastAPI-проектах его подключают напрямую, во Flask через обёртку Flask-Migrate. В Django он не нужен, там свои миграции.
Как устроено:
- ревизия: Python-файл с функциями
upgrade()иdowngrade(), внутри вызовыop.add_column,op.create_index,op.execute; - цепочка: у каждой ревизии есть
revisionиdown_revision, из них складывается граф. Текущая версия базы хранится в таблицеalembic_version; env.py: точка настройки. Здесь указываютtarget_metadata = Base.metadataдля автогенерации и берут URL базы из переменной окружения, а не изalembic.ini. Для асинхронного движка есть шаблонalembic init -t async.
Основные команды: alembic revision --autogenerate -m "...", alembic upgrade head, alembic downgrade -1, alembic current, alembic history.
Автогенерация сравнивает модели со схемой базы и выдаёт черновик, который обязательно читают глазами. Переименование колонки она видит как удаление и добавление, изменения server_default по умолчанию не отслеживает, новое значение в Enum PostgreSQL не замечает.
Если две ветки разработки создали ревизии от одного родителя, появляется несколько голов. Лечится это командой alembic merge heads, которая создаёт ревизию-слияние.
Где спотыкаются
Коммитят автогенерированную миграцию не читая. Переименование поля превращается в drop_column и потерю данных на проде.
Импортируют ORM-модели в миграцию для переноса данных. Через полгода модель изменится, и старая миграция перестанет выполняться. Для данных используют op.execute или локально описанную таблицу через sa.table().
Считают, что downgrade вернёт всё как было. Схему он откатит, а удалённые данные уже не восстановит, поэтому на проде ошибку обычно исправляют новой миграцией вперёд.