Как управлять миграциями базы данных с помощью SQLAlchemy

Ответ

Для управления версиями схемы базы данных в проектах на SQLAlchemy используется библиотека Alembic. Это стандартный инструмент для миграций, созданный авторами SQLAlchemy.

Alembic позволяет отслеживать изменения в моделях и генерировать скрипты для последовательного обновления структуры БД, что критически важно для командной разработки и развертывания приложений.

Основной процесс работы

  1. Установка:

    pip install alembic
  2. Инициализация репозитория миграций (выполняется в корне проекта):

    alembic init alembic

    Эта команда создаст директорию alembic с конфигурационными файлами.

  3. Настройка подключения к БД. В файле alembic.ini нужно указать URL для подключения к базе данных:

    sqlalchemy.url = postgresql://user:password@localhost/dbname

    В файле alembic/env.py необходимо указать Alembic, где искать метаданные ваших моделей, чтобы он мог автоматически определять изменения:

    # alembic/env.py
    from myapp.models import Base  # Импортируем базовый класс моделей
    target_metadata = Base.metadata
  4. Создание новой миграции. Alembic сравнивает текущее состояние моделей с состоянием в БД и генерирует скрипт миграции:

    alembic revision --autogenerate -m "Add user table"
  5. Применение миграции к БД:

    alembic upgrade head

    Команда head означает применение всех миграций до последней версии.

Ключевые команды

  • alembic current: Показать текущую версию миграции в БД.
  • alembic history: Показать историю всех миграций.
  • alembic downgrade -1: Откатить последнюю примененную миграцию.

Примечание: Для фреймворка Flask существует удобная обертка Flask-Migrate, которая интегрирует Alembic в жизненный цикл Flask-приложения.

Ответ 18+ 🔞

А, ну это ж про Алембик, блядь! Библиотека такая, Alembic, ёпта. Ну, это типа официальный костыль от самих создателей SQLAlchemy, чтобы твою схему базы данных не разъебало в хлам при каждом чихе. Без него — пиши пропало, особенно если в команде работаешь или на продакшен выкатываешь.

Как с этим говном работать, по шагам

  1. Ставим, естественно.

    pip install alembic

    Без этого нихуя не начнётся.

  2. Инициализируем репозиторий для миграций. Тыкаешь в корне проекта:

    alembic init alembic

    Он нагенерит папку alembic с кучей файлов. Не пугайся, это нормально.

  3. Настройка подключения, блядь. Это важно, а то он будет в пустоту пытаться лезть. В файле allembic.ini ищешь строчку с sqlalchemy.url и пишешь туда свою строку подключения, как для SQLAlchemy:

    sqlalchemy.url = postgresql://user:password@localhost/dbname

    А потом, внимание, ёбаный в рот, в файле alembic/env.py надо ему показать, где твои модели живут. Ищешь там target_metadata и делаешь так:

    # alembic/env.py
    from myapp.models import Base  # Импортируешь свой базовый класс, от которого все модели наследуются
    target_metadata = Base.metadata

    Теперь он будет видеть, что ты там в моделях намудрил.

  4. Создание миграции. Вот тут магия начинается. Ты меняешь свои модели (добавил колонку, таблицу новую), а потом говоришь Алембику:

    alembic revision --autogenerate -m "Add user table"

    Он посмотрит на твои модели, посмотрит на базу, офигеет от различий и нагенерит скрипт миграции в папке alembic/versions. В сообщении -m пиши человеческое описание, а то потом сам не вспомнишь, что за хуйню ты там накодил.

  5. Применить миграцию. Сгенерировал — теперь надо это добро в базу запихнуть:

    alembic upgrade head

    head — это типа «всё до последней версии». Если всё прошло без пиздеца, схема базы обновилась. Красота!

Ещё пара команд, чтобы не потеряться

  • alembic current — покажет, на какой версии миграции сейчас висит твоя база. Полезно, когда подозрение ебать чувствуешь, что что-то не так.
  • alembic history — покажет всю историю миграций, как они шли. Типа лента времени, только про SQL.
  • alembic downgrade -1 — ОПАСНАЯ КНОПКА, блядь! Откатывает последнюю применённую миграцию. Пользуй с умом, а то можно всё проебать.

Важный момент, нахуй: Если ты на Flask сидишь, есть обёрточка Flask-Migrate. Она эту всю алембичью хуйню в твоё Flask-приложение интегрирует, чтобы не пришлось руками в консоли ебаться. Очень удобная штука, рекомендую.