我已经使用 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, …Run Code Online (Sandbox Code Playgroud) 我正在使用 Alembic 作为迁移工具,并且我正在一个已经更新的数据库上启动以下伪脚本(Alembic 没有修订条目,数据库架构是最新的)。
revision = '1067fd2d11c8'
down_revision = None
from alembic import op
import sqlalchemy as sa
def upgrade():
op.add_column('box', sa.Column('has_data', sa.Boolean, server_default='0'))
def downgrade():
pass
Run Code Online (Sandbox Code Playgroud)
它只在 PostgreSQL 后面给我以下错误(这对 MySQL 来说都很好):
INFO [alembic.migration] Context impl PostgresqlImpl.
INFO [alembic.migration] Will assume transactional DDL.
INFO [root] (ProgrammingError) ERREUR: la colonne « has_data » de la relation « box » existe déjà
Run Code Online (Sandbox Code Playgroud)
最后一行表示该列has_data已存在。
我想检查该列之前是否存在op.add_column。