3

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

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

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

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

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

4

1 回答 1

2

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

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

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

db1 如果 在类db1中定义,则将所有文档保存在数据库中(否则您将得到一个)。db_aliasPostConnectionError

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

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

但是,根据您的评论

我们的系统使用许多数据库来托管这个模型

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

于 2013-09-08T16:52:08.530 回答