【问题标题】:Flask-migrate change db before upgrade升级前 Flask-migrate 更改数据库
【发布时间】:2020-11-12 18:32:53
【问题描述】:

我设置了一个多租户结构,其中每个客户都为他们设置了一个架构。该结构反映了“父”架构,因此发生的任何迁移都需要针对每个架构进行相同的操作。

我正在使用 Flask-Script 和 Flask-Migrate 来处理迁移。

到目前为止,我尝试的是迭代我的架构名称,为它们构建一个 URI,使用从 URI 生成的引擎限定一个新的 db.session,最后从 flask_migrate 运行升级功能。

    @manager.command
    def upgrade_all_clients():
        clients = clients_model.query.all()
        for c in clients:
            application.extensions["migrate"].migrate.db.session.close_all()
            application.extensions["migrate"].migrate.db.session = db.create_scoped_session(
                options={
                    "bind": create_engine(generateURIForSchema(c.subdomain)),
                    "binds": {},
                }
            )
            upgrade()
        return

我不完全确定为什么这不起作用,但结果是它只运行应用程序启动时设置的数据库的迁移。

我的理论是我不会更改管理器脚本运行时最初设置的会话。

有没有更好的方法来迁移这些模式中的每一个而不设置多个绑定和使用 --multidb 参数?我认为我不能在配置中使用 SQLALCHEMY_BINDS,因为这些模式需要能够动态创建/销毁。

【问题讨论】:

    标签: flask-sqlalchemy alembic flask-migrate flask-script


    【解决方案1】:

    对于那些遇到同样问题的人来说,我的具体情况的答案非常简单。

    @manager.command
    def upgrade_all_clients():
        clients = clients_model.query.all()
        for c in clients:
            print("Upgrading client '{}'...".format(c.subdomain))
            db.engine.url.database = c.subdomain
            _upgrade()
        return
    

    db.engine.url 的数据库属性是针对模式的。我不知道这是否是解决此问题的最佳方法,但它确实有效,我可以单独迁移每个架构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 2022-11-11
      • 2018-09-15
      • 1970-01-01
      相关资源
      最近更新 更多