Alembic
Теги: sqlalchemy alembic data-bases python
Тулза для миграции ДБ в [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