October 29, 2021

Alembic migrations

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

Миграция базы данных — это что-то похожее на систему контроля версий для баз данных. Стоит напомнить, что метод create_all() в SQLAlchemy лишь создает недостающие таблицы из моделей. Когда таблица уже создана, он не меняет ее схему, основываясь на изменениях в модели.

1. Установить alembic командой

pip install alembic

2. Запустить команду для формирования файлов alembic.ini и каталога {foldername}.

alembic init {foldername}

3. Изменим configuration/connection/logging настройки в файле alembic.ini

sqlalchemy.url = postgresql://{username}:{pass}@localhost:5432/{base}

4. Изменим {foldername}/env.py:

from .. import models # from db import metadata

и добавим

target_metadata = models.metadata #or target_metadata = models.Base.metadata

5. Создадим вручную миграции с помощью команды "alembic revision -message="Комментарий миграции" --autogenerate"

alembic revision -message="init" --autogenerate

6. Проверить созданные миграции в {foldername}/versions/....py

"""essage=id to BIGINT

Revision ID: 3681ce64363e
Revises: 5820429acae8
Create Date: 2021-07-09 14:43:44.240862

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = '3681ce64363a'
down_revision = '582042qacae8'
branch_labels = None
depends_on = None


def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_unique_constraint(op.f('uq__proxy__id'), 'proxy', ['id'])
    # ### end Alembic commands ###


def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_constraint(op.f('uq__proxy__id'), 'proxy', type_='unique')
    # ##
    
    # end Alembic commands ###

*В upgrade мы видим, что у нас создается табличка. В downgrade эта табличка удаляется. Alembic по умолчанию специально добавляет такие комментарии, чтобы вы зашли туда, отредактировали его, хотя бы удалили эти комментарии. И на всякий случай просмотрели миграцию, убедились, что вас все устраивает. Это вопрос одной команды. У вас уже есть миграция.

7. Применить миграции командой:

alembic upgrade head

*Если мы скажем head, он попытается обновиться до самой свежей миграции. Если назовем конкретную миграцию, он обновится до нее. Также есть команда downgrade — на случай, если вы, например, передумали. Все это выполняется в транзакциях и работает достаточно просто.

В итоге должны получить подобную схему приложения:

project
├── apps
│   ├──app_name
│   │   ├── __init__.py
│   │   ├── db
│   │   │   ├── __init__.py
│   │   │   ├── alembic.ini
│   │   │   ├── models.py
│   │   │   ├── schema.py
│   │   │   └── migrations
│   │   │       ├── __init__.py
│   │   │       ├── env.py
│   │   │       ├── README
│   │   │       └── versions
│   │   │           ├── v.1
│   │   │           └── v.2
├── config.py
└── requipments.txt

Краткое описание каждой папки и файла:

  • alembic.ini — файл с настройки Alembic.
  • env.py — файл Python, который запускается каждый раз, когда вызывается Alembic. Он соединяется с базой данных, запускает транзакцию и вызывает движок миграции.
  • README — файл README.
  • script.py.mako — файл шаблона Mako, который будет использоваться для создания скриптов миграции.
  • version — папка для хранения скриптов миграции.

Источники:

  1. https://pythonru.com/uroki/16-migracii-bazy-dannyh-s-pomoshhju-alembic
  2. https://habr.com/ru/company/yandex/blog/511892/
  3. https://learn.co/lessons/sqlalchemy-alembic-migrations
  4. https://alembic.sqlalchemy.org/en/latest/
  5. https://github.com/alvassin/alembic-quickstart