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
— папка для хранения скриптов миграции.