Я создал несколько миграций, уже используя Alembic, это действительно интересный инструмент.
Использовать его на новой БД было бы достаточно просто, однако наш сценарий использования заключается в применении этих миграций к существующим БД, а нетолько для того, чтобы довести их «до скорости», но чтобы убедиться, что, например, если таблица или столбец будут изменены через интерфейс phpmyadmin или таблица уже существует, ее можно исправить / создать.
Это было бы прекрасно, поскольку созданный для этого сценария MigrationID мог бы быть применен к любой имеющейся у нас БД, исправляя любые несоответствия, не создавая дубликатов, пропуская то, что он считает правильным.
Как уже упоминалось, свежую базу данных, созданную с использованием Alembic, можно было бы исправить с помощью понижения версии и повторного применения, но мне интересно, можно ли это сделать с существующей БД, где Alembic применяется после.
Для справки, вот первый пример кода миграции, если он чем-то полезен.
"""create account table
Revision ID: bd4ec9e8afe8
Revises:
Create Date: 2019-10-29 15:25:39.736234
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects.mysql import TINYINT
# revision identifiers, used by Alembic.
revision = 'bd4ec9e8afe8'
down_revision = None
branch_labels = None
depends_on = None
def upgrade():
op.create_table(
'account',
sa.Column('id', sa.Integer, primary_key=True, nullable=False),
sa.Column('title', sa.String(150), nullable=False),
sa.Column('description', sa.Text, nullable=False),
sa.Column('uploads_allowed', TINYINT(), nullable=True),
sa.Column('viewers_contact_details', TINYINT(), default=0),
)
op.alter_column('account', sa.Column('id', sa.Integer, nullable=False, autoincrement=True))
# op.execute("""
# CREATE TABLE `account` (
# `id` int(11) NOT NULL,
# `title` varchar(150) NOT NULL,
# `description` text,
# `uploads_allowed` tinyint(1) DEFAULT '0',
# `viewers_contact_details` tinyint(1) DEFAULT '0'
# );
# """)
def downgrade():
op.drop_table('account')