升级前烧瓶迁移更改数据库

时间:2020-11-12 18:32:53

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

我建立了一个多租户结构,其中每个客户端都有为其设置的架构。该结构反映了“父”架构,因此,每个架构所发生的任何迁移都必须相同。

我正在使用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,因为这些架构需要能够动态创建/销毁。

1 个答案:

答案 0 :(得分:0)

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

@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的数据库属性是针对模式的。我不知道这是否是解决此问题的最佳方法,但它确实有效,我可以分别迁移每个架构。