我的Flask应用程序带有Post
模型,跨越多个MongoDB数据库(db1,db2,db3,...),所以我需要能够查询不同的dbs。
我正在使用Flask-MongoEngine
扩展名。
我的__init__.py
包含以下行:
db = MongoEngine(app)
在config.py
我有:
MONGODB_SETTINGS = {'DB': 'db1'}
我尝试了以下但没有成功:
connection
对象中的db
参数,如下所示:db.connection = mongoengine.connect('db2')
post = Post.objects.all()
仍然在原始数据库(db1
)上运行。 Post
班meta
中创建别名,如下所示:'db_alias': 'db1'
connection
对象中的db
参数,如下所示:db.connection = mongoengine.connect('db2', alias='db1')
db2
的连接,但是我无法将其更改为另一个数据库。 MONGODB_SETTINGS
设为{'DB': 'db2'}
,然后设为db = MongoEngine(app)
似乎一旦models.py
中的模型已加载(或连接到数据库),您就无法更改其连接。
这是对的吗?
如何更改同一型号的数据库?
编辑:Django等效项是ORM中的using
参数,它允许查询同一模型的不同数据库。
答案 0 :(得分:2)
正确识别后, MongoEngine 实例以及从中创建的所有文档(模型)都绑定到特定数据库。
您可以通过调用实例上的switch_db
方法(临时)将文档实例使用的数据库更改为文档类中定义的别名:
Post.objects.all().switch('db1').save()
如果<{em> db1
在db1
类中定义为db_alias
,会将所有文档保存在数据库Post
中(否则您将获得一个ConnectionError
)。
或者,有许多方法可以使初始配置“动态”,例如尊重环境变量:
import os
app['MONGODB_SETTINGS'] = {'db': os.environ.get('DBNAME', 'db2')}
但是,从您的评论中
我们的系统使用多个数据库来托管此模型
似乎你可能想要的是Sharding,其中MongoDB负责在多台机器上的多个mongod
实例上分发集合。在这种情况下,您将连接到mongos
,它负责将查询路由到正确的分片。每个分片上的数据库名称相同。