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

Flask 当架构没有更改时,防止生成alembic自动迁移,flask,flask-sqlalchemy,snowflake-cloud-data-platform,alembic,flask-migrate,Flask,Flask Sqlalchemy,Snowflake Cloud Data Platform,Alembic,Flask Migrate,我正在开发一个flask应用程序,并通过连接器使用snowflake数据库 我的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.Stri

我正在开发一个flask应用程序,并通过连接器使用snowflake数据库

我的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升级时也能正常工作

但当我第二次运行
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 ###
我尝试了对绑定到flask
db
对象的
元数据的各种配置设置,但在使用alembic的自动生成功能时,我总是得到这种冗余迁移。即使使用此冗余迁移执行升级,在再次运行
flask db migrate
时,也会得到另一个副本。我与数据库的连接字符串中确实包含架构,因为雪花会抱怨:

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

SQLALCHEMY\u DATABASE\u URI='snowflake://:@,但这对我没有帮助。我没有在任何模型或迁移脚本中指定模式,只在连接url中指定模式。

我将回答我的问题,以供将来可能遇到此问题的人参考:


问题似乎在于snowflake sqlalchemy如何为外键设置模式名称。它指定数据库连接字符串中使用的模式名称,因此现有外键与该模式相关联。但是,所比较的元数据外键没有显式模式(因为模型类没有定义模式),并且alembic在比较两者时注意到模式名称的差异。我在这里解释了一个可能的问题修复方法,但不确定是否有更干净的方法:

看起来这个外键是使用一个不同于SQLAlchemy/Alembic期望的名称创建的,因此您总是会得到一个迁移,试图将该名称修复回期望的名称。看见