Flask在升级前迁移更改数据库



我设置了一个多租户结构,其中每个客户端都为它们设置了模式。该结构反映了";"父";模式,所以发生的任何迁移都需要对每个模式进行相同的迁移。

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

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

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

最新更新