Alembic

Тулза для миграции ДБ в [sqlalchemy] на python

документация

Базовые принципы

Создание окружения для миграции

Через alembic init folder

Создается вот такая структура:

- yourproject/
  - alembic/
    - env.py
    - README
    - script.py.mako
    - versions/
      - 3512b954651e_add_account.py
      - 2b1ae634e5cd_add_order_id.py
      - 3adcc9a56557_rename_username_field.py

Здесь env.py определяет инструкции для миграций. script.py.mako генерирует новые скрипты миграции, а в versions/ хранятся все версии миграций.

alembic list_templates выведет все шаблоны миграций

Теперь можно сконфигурировать файл alembic.ini

Для началанам будет достаточно указать расположение БД, например так:

sqlalchemy.url = sqlite:///./test.db

Создание миграции

Мы можем создать новую версию миграционного скрипта так: alembic revision -m "create account table"

Запуск миграций

alembic upgrade head

Еще команды

Кроме того, в скрипте миграции содержится информация об ID миграции

revision = 'ae1027a6acf'

Можно использовать команды типа alembic upgrade ae1 чтобы запускаться относительно специфического скрипта. Если несколько скриптов удовлетворяют идентификатору, действия будут остановлены и будет выдано сообщение.

  • alembic upgrade +2 две версии включая текущую для апгрейда
  • alembic downgrade -1 на предыдущую для даунгрейда
  • alembic upgrade ae10+2 на версию ae10 + две за ней
  • alembic current получить инфу о текущей версии
  • alembic history --verbose история, более подробно
  • alembic downgrade base даунгрейд в самое начало
  • alembic upgrade head апгрейд до самого конца

Автогенерация миграций

Алембик может смотрет ь в статус ДБ и генерировать миграции автоматически. Это делается с помщью alembic revision --autogenerate. Чтобы использовать автогенерацию, необходимо модифицировать env.py, что-бы предоставить доступ к контенту таблиц. Вместо:

target_metadata = None

использовать

from myapp.mymodel import Base
target_metadata = Base.metadata

Далее выполняем alembic revision --autogenerate -m "migration name"

Что может, а что не может автомиграция?

Может задетектить:

  • Table additions, removals
  • Column additions, removals
  • Change of nullable status on columns
  • Basic changes in indexes and explicitly-named unique constraints
  • Basic changes in foreign key constraints

Опционально может задетектить:

  • Change of column type
  • Change of server default

Не может задетектить:

  • Changes of table name
  • Changes of column name
  • Anonymously named constraints
  • Special SQLAlchemy types such as Enum when generated on a backend which doesn’t support ENUM directly

Пока нельзя, но в будущем станет возможно:

  • Some free-standing constraint additions and removals may not be supported, including PRIMARY KEY, EXCLUDE, CHECK
  • Sequence additions, removals

Всегда нужно контроллировать что именно сгенерировал алембик.

Autogenerating Multiple MetaData collections

Controlling What to be Autogenerated - параметры автогенерации

  • фильтрация ненужных Схем
  • фильтрация таблиц
  • фильтрация объектов (напирме по колонкам)

Comparing and Rendering Types проверка типов

Applying Post Processing and Python Code Formatters to Generated Revisions

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

Остальная часть книги посвязена работе в больших проектах и деталям:

  • генерация sql-скриптов (для больших проектов)
  • наименования и их значимость
  • batch миграции
  • работа с ветками
  • cookbook
  • api

[sqlalchemy]