Введение
Базы данных развиваются вместе с приложением — добавляются поля, таблицы, индексы, меняются связи. Управлять этими изменениями вручную — сложно и рискованно. Alembic – миграции базы данных позволяет безопасно и удобно отслеживать изменения схемы базы, накатывать обновления и откатывать неудачные шаги.
Alembic — это официальный инструмент миграций для SQLAlchemy, поддерживающий как синхронные, так и асинхронные проекты, включая FastAPI, Flask и другие фреймворки.
Установка и инициализация Alembic
Установка:
Инициализация проекта миграций:
Будет создана папка alembic/
с файлами и alembic.ini
.
Базовые команды Alembic
-
alembic revision -m "описание"
— создание новой ревизии вручную -
alembic revision --autogenerate -m "описание"
— генерация на основе моделей -
alembic upgrade head
— применить все миграции -
alembic downgrade -1
— откатить последнюю миграцию -
alembic history
— история ревизий
Интеграция с SQLAlchemy
В alembic/env.py
необходимо указать путь к Base
, где определены модели:
Также указывается URL подключения:
Создание и применение миграций
Ручная миграция
Затем редактируем файл миграции:
Автоматическая генерация
Alembic сравнивает Base.metadata
с текущим состоянием базы.
Откат миграций и история изменений
-
alembic downgrade -1
— откатить последнюю миграцию -
alembic downgrade base
— откатить всё -
alembic show <revision_id>
— показать SQL изменений -
alembic current
— текущая ревизия базы
Работа с несколькими базами данных
В env.py
можно настроить выбор базы по параметрам:
Или использовать переменные окружения.
Alembic в асинхронных проектах
С SQLAlchemy 2.0 поддержка async
стала официальной:
В env.py
необходимо использовать async-версию функций run_migrations_online()
и подключения к базе.
Миграции и тестирование
-
Создание временной базы для тестов
-
Проверка корректности миграций через
alembic upgrade head
-
Использование
pytest
и фикстур с rollback
CI/CD и Alembic
GitHub Actions
Можно использовать на этапе деплоя или перед запуском тестов.
GitLab CI
Добавьте шаг в .gitlab-ci.yml
:
Советы по структуре и best practices
-
Давайте понятные имена миграциям
-
Одна миграция — одно логическое изменение
-
Проверяйте SQL, особенно при
autogenerate
-
Комментируйте изменения в файлах ревизий
-
Не удаляйте миграции, даже если они "устарели"
Сравнение с другими инструментами миграции
Инструмент | Язык | Поддержка ORM | Авто-генерация | Подходит для |
---|---|---|---|---|
Alembic | Python | SQLAlchemy | Да | Flask, FastAPI, SQLAlchemy |
Django Migrations | Python | Django ORM | Да | Только Django |
Flyway | SQL | Нет | Нет | Java-проекты, CLI |
Liquibase | XML/SQL | Нет | Нет | Enterprise-решения |
Часто задаваемые вопросы (FAQ)
1. Что такое Alembic?
Это инструмент миграций базы данных для SQLAlchemy.
2. Поддерживает ли Alembic асинхронность?
Да, с SQLAlchemy 1.4+ и 2.0 поддерживается async engine
.
3. Нужно ли писать SQL вручную?
Не обязательно, есть поддержка --autogenerate
.
4. Как откатить только одну миграцию?
С помощью alembic downgrade -1
.
5. Можно ли использовать Alembic без SQLAlchemy ORM?
Да, но тогда нужно писать миграции вручную.
6. Где хранится история миграций?
В таблице alembic_version
в базе данных.
Полный справочник по ключевым функциям и модулям библиотеки Alembic для Python
Установка
Инициализация Alembic
Команда | Описание |
---|---|
alembic init alembic |
Создает структуру проекта Alembic. |
alembic.ini |
Конфигурационный файл (подключение к БД и параметры миграций). |
Настройка подключения к БД
В файле alembic.ini
:
Или задать программно в env.py
:
Создание миграции
Команда | Описание |
---|---|
alembic revision -m "msg" |
Создает пустую миграцию. |
alembic revision --autogenerate -m "msg" |
Создает миграцию на основе изменений моделей. |
Применение и откат миграций
Команда | Описание |
---|---|
alembic upgrade head |
Применяет все миграции до последней. |
alembic downgrade -1 |
Откатывает последнюю миграцию. |
alembic downgrade base |
Откат до начального состояния. |
Работа с версиями
Команда | Описание |
---|---|
alembic current |
Показывает текущую версию схемы. |
alembic history |
Список всех миграций. |
alembic heads |
Все активные точки миграций. |
alembic show <revision> |
Показывает содержание миграции. |
Структура файла миграции
Основные операции (через op
)
Метод | Описание |
---|---|
op.create_table(...) |
Создание таблицы. |
op.drop_table(name) |
Удаление таблицы. |
op.add_column(table, column) |
Добавление столбца. |
op.drop_column(table, column) |
Удаление столбца. |
op.alter_column(...) |
Изменение типа/атрибутов столбца. |
op.create_index(...) |
Создание индекса. |
op.drop_index(...) |
Удаление индекса. |
op.execute("SQL") |
Выполнение произвольного SQL. |
Автогенерация: ограничения и рекомендации
Особенности | Описание |
---|---|
Требует target_metadata |
Установить в env.py через ваши модели. |
Не отслеживает изменения данных | Только структура таблиц. |
Иногда требует ручной правки | Проверьте миграции после генерации. |
Пример настройки для SQLAlchemy + Alembic
Использование с FastAPI
-
Создайте
SQLAlchemy
-движок вdb.py
. -
Подключите
Base.metadata
вenv.py
. -
Используйте
alembic upgrade head
при запуске.
Работа в CI/CD
Практика | Рекомендация |
---|---|
Храните миграции в Git | Как часть кода. |
Автоматически выполняйте upgrade head при деплое |
Через alembic upgrade head . |
Используйте --sql для dry-run |
Не выполняет миграции, а выводит SQL. |
Интеграция с другими библиотеками
Библиотека | Применение |
---|---|
SQLAlchemy | Основная зависимость. |
FastAPI / Flask | Используется через SQLAlchemy . |
async SQLAlchemy | Неофициальная поддержка через сторонние решения (например, alembic[asyncio] ). |
Pydantic | Для сериализации моделей (отдельно от миграций). |
Заключение
Alembic – миграции базы данных — это надёжный и гибкий инструмент для управления схемой базы. Он упрощает работу разработчиков, помогает поддерживать единое состояние базы данных между окружениями и обеспечивает безопасность при изменениях. Благодаря поддержке как синхронных, так и асинхронных приложений, Alembic стал стандартом де-факто для проектов на SQLAlchemy.