【问题标题】:Prevent alembic auto-migration from being generated when there are no changes to the schema当架构没有更改时,防止生成 alembic 自动迁移
【发布时间】:2019-12-23 01:44:20
【问题描述】:

我正在开发一个烧瓶应用程序,并通过snowflake-sqlalchemy 连接器将Flask-Migrate 与雪花数据库一起使用。

我的 app/models.py 中有以下模型:

class User(db.Model):
    username = db.Column(db.String(100), primary_key=True)


class UserActions(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user = db.Column(db.String(100), db.ForeignKey('user.username'))

如您所见,这是一个简单的 2 表示例,其中一个表具有外键约束。

我第一次运行 flask db migrate 时,得到以下自动生成的迁移:

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('user',
    sa.Column('username', sa.String(length=100), nullable=False),
    sa.PrimaryKeyConstraint('username', name=op.f('pk_user'))
    )
    op.create_table('user_actions',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('user', sa.String(length=100), nullable=True),
    sa.ForeignKeyConstraint(['user'], ['user.username'], name=op.f('fk_user_actions_user_user')),
    sa.PrimaryKeyConstraint('id', name=op.f('pk_user_actions'))
    )
    # ### end Alembic commands ###

看起来很棒,并且在执行 flask db upgrade 时按预期工作。

但是当我第二次运行flask db migrate 时,即使架构没有变化,它也会产生另一个迁移

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_constraint('fk_user_actions_user_user', 'user_actions', type_='foreignkey')
    op.create_foreign_key(op.f('fk_user_actions_user_user'), 'user_actions', 'user', ['user'], ['username'])
    # ### end Alembic commands ###

def downgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_constraint(op.f('fk_user_actions_user_user'), 'user_actions', type_='foreignkey')
    op.create_foreign_key('fk_user_actions_user_user', 'user_actions', 'user', ['user'], ['username'], referent_schema='{my-schema}')
    # ### end Alembic commands ###

我已经尝试了对绑定到烧瓶 db 对象的 metadata 的各种配置设置,但是在使用 alembic 的自动生成功能时,我总是得到这种冗余迁移。即使我使用此冗余迁移执行升级,再次运行flask db migrate 时我也会得到另一个副本。我到数据库的连接字符串中确实有模式,因为雪花会抱怨:

SQLALCHEMY_DATABASE_URI='snowflake://<my_login_name>:<password>@<account_name>/<database_name>/<schema_name>?warehouse=<warehouse_name>?role=<role_name>'

这里发生了什么?即使架构没有更改,为什么每次都会产生冗余迁移?我已经阅读了this link,但这对我没有帮助。我没有在任何模型或迁移脚本中指定架构,仅在连接 url 中。

【问题讨论】:

  • 看起来这个外键是使用与 SQLAlchemy/Alembic 期望的名称不同的名称创建的,因此您总是会进行迁移,试图将该名称修复回预期的名称。见alembic.sqlalchemy.org/en/latest/naming.html

标签: flask flask-sqlalchemy snowflake-cloud-data-platform alembic flask-migrate


【解决方案1】:

我将为将来有机会的人回答我的问题:

似乎问题在于 snowflake-sqlalchemy 如何为外键设置模式名称。它分配在 db 连接字符串中使用的模式名称,因此现有的外键与该模式相关联。但是,被比较的元数据外键没有明确的模式(因为模型类没有定义),并且 alembic 在比较两者时注意到模式名称的差异。我在这里解释了解决问题的可能方法,但不确定是否有更清洁的方法:https://github.com/snowflakedb/snowflake-sqlalchemy/issues/145

【讨论】:

    猜你喜欢
    • 2022-11-21
    • 2019-03-10
    • 1970-01-01
    • 2012-06-26
    • 2016-05-21
    • 2020-11-05
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多