flask-sqlalchemy - 升级前 Flask-migrate 更改数据库
问题描述
我设置了一个多租户结构,其中每个客户都为他们设置了一个模式。该结构反映了“父”模式,因此发生的任何迁移都需要以相同的方式发生在每个模式中。
我正在使用 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 的数据库属性是针对模式的。我不知道这是否是解决这个问题的最佳方法,但它确实有效,我可以单独迁移每个模式。
推荐阅读
- java - 如何从一个方法(在Java中)对多个数组的元素求和?
- java - 是什么导致 PersistenceException 消息“分离的实体传递给 perist”
- r - R数据表-创建一个由其他变量条件排序的变量
- python - 如何计算熊猫数据框的2个索引之间的行数
- c# - 根据用户输入选择返回日期时间格式
- nlp - 关于使用python进行自然语言处理的问题
- vb.net - 调用方法并收集结果的 LINQ 组数据上的 Parallel.ForEach
- c++ - GLSL:根据与相机的距离淡化 2D 网格
- css - 我无法使用 flexbox 在标题中居中 H1
- spring - Spring中的CDI @ApplicationScoped bean