Flask MongoEngine - 如何更改数据库?

时间:2013-04-15 18:52:03

标签: flask mongoengine

我的Flask应用程序带有Post模型,跨越多个MongoDB数据库(db1,db2,db3,...),所以我需要能够查询不同的dbs。
我正在使用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()仍然在原始数据库(db1)上运行。
  2. Postmeta中创建别名,如下所示:
    'db_alias': 'db1'
    然后我改变了connection对象中的db参数,如下所示:
    db.connection = mongoengine.connect('db2', alias='db1')
    这确实会创建与db2的连接,但是我无法将其更改为另一个数据库。
  3. MONGODB_SETTINGS设为{'DB': 'db2'},然后设为db = MongoEngine(app)
    这不起作用
  4. 似乎一旦models.py中的模型已加载(或连接到数据库),您就无法更改其连接。
    这是对的吗? 如何更改同一型号的数据库? 编辑:Django等效项是ORM中的using参数,它允许查询同一模型的不同数据库。

1 个答案:

答案 0 :(得分:2)

正确识别后, MongoEngine 实例以及从中创建的所有文档(模型)都绑定到特定数据库。

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

Post.objects.all().switch('db1').save()
如果<{em> db1db1类中定义为db_alias

会将所有文档保存在数据库Post 中(否则您将获得一个ConnectionError)。

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

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

但是,从您的评论中

  

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

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