当架构没有更改时,防止生成Alembic自动迁移

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

我的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(),sa.Column('user',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',['user'],['username'])
    # ### end Alembic commands ###

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

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

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

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

jiesite 回答:当架构没有更改时,防止生成Alembic自动迁移

我会回答我的问题,以供日后使用此功能的人使用

问题似乎出在雪花雪花sqlalchemy如何设置外键的架构名称上。它分配在数据库连接字符串中使用的架构名称,因此现有外键与该架构相关联。但是,要与之比较的元数据外键没有显式的架构(因为模型类未定义),而Alembic在比较两者时会注意到架构名称有所不同。我在这里说明了可能解决此问题的方法,但是不确定是否有更清洁的方法:https://github.com/snowflakedb/snowflake-sqlalchemy/issues/145

本文链接:https://www.f2er.com/2875525.html

大家都在问