gpt4 book ai didi

Flask MongoEngine - 如何更改数据库?

转载 作者:行者123 更新时间:2023-12-03 16:06:37 25 4
gpt4 key购买 nike

我有一个带有 Post 模型的 Flask 应用程序,它跨越多个 MongoDB 数据库(db1、db2、db3 等),所以我需要能够查询不同的数据库。
我正在使用 Flask-MongoEngine 扩展。

我的 __init__.py 包含以下行:
db = MongoEngine(app)
config.py 中我有:
MONGODB_SETTINGS = {'DB': 'db1'}

我尝试了以下但没有成功:

  1. 像这样更改 db 对象中的 connection 参数:
    db.connection = mongoengine.connect('db2')
    它没有改变任何东西。执行 post = Post.objects.all() 仍然在原始数据库 (db1) 上运行。
  2. Postmeta 中创建别名,如下所示:
    'db_alias': 'db1'
    然后我像这样更改了 db 对象中的 connection 参数:
    db.connection = mongoengine.connect('db2', alias='db1')
    这确实会创建到 db2 的连接,但是我无法将它更改为另一个数据库。
  3. MONGODB_SETTINGS 设置为 {'DB': 'db2'} 然后 db = MongoEngine(app)
    这也行不通

似乎一旦加载了 models.py 中的模型(或连接到数据库),就无法更改其连接。
对吗?
如何更改同一型号上的数据库?
编辑:Django 等效项是 ORM 中的 using 参数,它允许为同一模型查询不同的数据库。

最佳答案

正如您正确识别的那样,一个 MongoEngine 实例以及由此创建的所有文档(模型)都绑定(bind)到一个特定的数据库。

您可以(暂时)将文档实例使用的数据库更改为文档类中定义的别名,方法是调用实例上的 switch_db 方法:

Post.objects.all().switch('db1').save()

将所有文档保存在数据库db1 如果 db1中被定义为db_alias发布 类(否则你会得到一个 ConnectionError)。

或者,有许多方法可以使初始配置“动态”,例如遵守环境变量:

import os
app['MONGODB_SETTINGS'] = {'db': os.environ.get('DBNAME', 'db2')}

但是,从你的评论来看

Our system uses a number of databases to host this model

看来你可能想要的是Sharding ,其中 MongoDB 负责在多台机器上的多个 mongod 实例上分发集合。在这种情况下,您改为连接到 mongos,它负责将查询路由到正确的分片。每个分片上的数据库名称相同。

关于Flask MongoEngine - 如何更改数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16022665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com