防止在架构没有更改时生成 alembic 自动迁移
Prevent alembic auto-migration from being generated when there are no changes to the schema
我正在开发一个烧瓶应用程序并使用 Flask-Migrate with a snowflake database through the 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 table 示例,其中一个 table 具有外键约束。
我第一次 运行 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 ###
我尝试了对绑定到 flask db
对象的 metadata
的各种配置设置,但在使用 alembic 的自动生成功能时,我总是会遇到这种冗余迁移。即使我使用此冗余迁移执行升级,当再次 运行ning 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.
中指定
我会为以后有机会的人回答我的问题:
问题似乎出在 snowflake-sqlalchemy 如何设置外键的架构名称上。它分配在数据库连接字符串中使用的模式名称,因此现有的外键与该模式相关联。然而,被比较的元数据外键没有显式模式(因为模型 类 没有定义模式),并且 alembic 在比较两者时注意到模式名称的差异。我在这里解释了可能解决问题的方法,但不确定是否有更简洁的方法:https://github.com/snowflakedb/snowflake-sqlalchemy/issues/145
我正在开发一个烧瓶应用程序并使用 Flask-Migrate with a snowflake database through the 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 table 示例,其中一个 table 具有外键约束。
我第一次 运行 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 ###
我尝试了对绑定到 flask db
对象的 metadata
的各种配置设置,但在使用 alembic 的自动生成功能时,我总是会遇到这种冗余迁移。即使我使用此冗余迁移执行升级,当再次 运行ning 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.
中指定我会为以后有机会的人回答我的问题:
问题似乎出在 snowflake-sqlalchemy 如何设置外键的架构名称上。它分配在数据库连接字符串中使用的模式名称,因此现有的外键与该模式相关联。然而,被比较的元数据外键没有显式模式(因为模型 类 没有定义模式),并且 alembic 在比较两者时注意到模式名称的差异。我在这里解释了可能解决问题的方法,但不确定是否有更简洁的方法:https://github.com/snowflakedb/snowflake-sqlalchemy/issues/145