从Django连接到多个MongoDB实例

4
我正在使用Mongoengine和Django,我的项目需要在单个请求中连接两个MongoDB实例。如果我使用以下代码,它可以正常工作:
connect("mdb1")
#do stuff with mdb1
...
connect("mdb2")
#do stuff with mdb2

但我想知道这是否是正确的做法。


那有什么问题呢?有什么疑问吗?除了在某个时刻明确地打开显式数据库连接之外,你还想以何种方式连接到任何数据库? - user2665694
3个回答

12

MongoEngine 0.6添加了对多个数据库的支持。

使用register_connection演示。

alias_lists = ['users-books-db', 'user-db', 'book-db'] # list of aliases
dbs = ['author-book-pairs', 'users', 'books'] # list of databases
for alias, db in zip(alias_lists, dbs):
    register_connection(alias, db)

class User(Document):
    name = StringField()
    meta = {"db_alias": "user-db"}

class Book(Document):
    name = StringField()
    meta = {"db_alias": "book-db"}

class AuthorBooks(Document):
    author = ReferenceField(User)
    book = ReferenceField(Book)
    meta = {"db_alias": "users-books-db"}

不过有一件事...这在DynamicDocuments中不起作用,特别是当需要在运行时动态添加元数据时。 - qre0ct

2
@Ricardo,官方文档中有一节讲解上下文管理(即使用同一文档切换数据库:http://docs.mongoengine.org/guide/connecting.html#switch-database)。以下代码将把最初存储在users-db中的User类切换到新的数据库archive-user-db中。
from mongoengine.context_managers import switch_db

class User(Document):
     name = StringField()

     meta = {"db_alias": "user-db"}

with switch_db(User, 'archive-user-db') as User:
     User(name="Ross").save()  # Saves the 'archive-user-db'

除了源URL之外,还应包括相关信息。 - winwaed
1
链接已经失效。http://docs.mongoengine.org/guide/connecting.html#switch-database - Vahid Kharazi

0
我认为没有一种合适的方式来做这个。Matt的例子强制使用了按文档类型连接。如果我想要使用一个文档和多个连接,这个例子就不适用了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接