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

标签 flask sqlalchemy flask-sqlalchemy alembic flask-migrate

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

例如,如果我删除迁移并旋转一个全新的数据库,然后执行管理数据库迁移,然后执行管理数据库升级,一切正常。如果我随后对 db.Model 表进行更改,然后执行manage db migrate,我不会收到错误。

但是,新的迁移脚本指向前一个脚本,但不仅仅是将数据库从以前的架构状态转移到新的架构状态所需的差异,而是从空架构开始的完整(绝对)迁移 - 如,它会尝试再次从头开始创建表(进行更改),而不仅仅是将更改应用于已创建的架构。也就是说,即使迁移与前一个迁移相关联,它也没有考虑到前一个迁移所应用的内容。这意味着它们无法链接,因为例如第二次迁移将尝试再次创建表,因此第二次调用时管理数据库升级失败。

我的管理应用程序如下所示:

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)

关于Flask-Migrate 与 postgres 模式一起使用时会创建相同的重复迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57746979/

相关文章:

python - 已结束的程序(Flask)一直将输出发送到 STDOUT?

javascript 'setTimeout' 函数在 Flask Web 服务器上运行 6 分钟后停止

python - Sql Alchemy QueuePool 限制溢出

orm - 使用 sqlalchemy 实现 "soft delete"系统

mysql - 我的结果中有重复记录

flask - JSONAPI : Update relationships including attributes

python - Flask 和 WSGI 出现间歇性 500 HTTP 错误

flask - 在 Flask-SQLAlchemy : How do I set check_same_thread=False in config. py 中?

python - 如何在 Flask/SQLAlchemy 中显示包含多对多查询结果的列

python - 如何使用 SQLAlchemy/PostgreSQL 将日期+时间存储为 UTC