Flask-Migrate 在与 postgres 模式一起使用时会创建相同的重复迁移

Flask-Migrate creates the same duplicate migration when used with postgres schemas

我有一个非常简单和愚蠢的问题,但我不知道我错过了什么。基本上,我目前编写管理应用程序的方式似乎 flask migrate 总是创建一个绝对迁移,而不仅仅是一个从以前的模式迁移到当前模式的变更集。

例如,如果我删除我的迁移并旋转一个全新的数据库,然后我执行 manage db migrate 然后 manage db upgrade 所有工作。如果我然后更改 db.Model table 然后执行 manage db migrate 我不会收到错误。

然而,新的迁移脚本指向之前的脚本,但不仅仅是将数据库从之前的模式状态获取到新模式状态所需的差异,而是从空模式开始的完整(绝对)迁移 -例如,它将尝试再次从头开始创建 tables(通过更改),而不仅仅是将更改应用于已创建的模式。也就是说,即使迁移与上一个迁移相关联,它也没有考虑到上一个迁移已应用的内容。这意味着它们不能被链接起来,因为例如第二次迁移将尝试再次创建 table,因此第二次调用时 manage db upgrade 失败。

我的 manage 应用程序如下所示:

from flask_migrate import Migrate, MigrateCommand

from src.common.db import db
from src.common.flaskery import global_flask_app, global_flask_manager

app = global_flask_app(__name__)
migrate = Migrate(app, db)
manager = global_flask_manager(__name__)
manager.add_command('db', MigrateCommand)

from src.db.models import *

def main():
    manager.run()

if __name__ == '__main__':
    main()

相似:Flask Migrate using different postgres schemas ( __table_args__ = {'schema': 'test_schema']})

因此在您的 migrations/env.py 中,您需要将 include_schemas=True 添加到配置中,如下所示:

context.configure(connection=connection,
                  target_metadata=target_metadata,
                  process_revision_directives=process_revision_directives,
                  include_schemas=True,
                  **current_app.extensions['migrate'].configure_args)