mongoengine支持程序同时连接多个数据库,这些数据库可以位于一个或多个mongo之中,通过alias名称区分不同的连接即可。
可以通过switch_db切换到不同的数据库,进行读写操作,switch_db其实是一个上下文管理器,通过和with语句一起使用,能够保证切换数据库的影响范围。
由于个人电脑上没有安装mongodb,以下代码示例中访问的mongodb通过mongoengine提供的mock mongodb替代,只需要在connect函数参数中加上is_mock=True参数,并且安装有mongomock package(pip install mongomock)即可。
1 #!/usr/bin/env python
2 # coding=utf-8
3 from mongoengine import connect
4 from mongoengine.document import Document
5 from mongoengine.fields import StringField, IntField
6 from mongoengine.context_managers import switch_db
7
8
9 # 连接不同db
10 connect(alias='testdbA', is_mock=True)
11 connect(alias='testdbB', is_mock=True)
12 connect(alias='testdbC', is_mock=True)
13
14
15 class User(Document):
16 meta = {
17 # db_alias用于指定User绑定的mongo连接,和connect函数中的alias对应
18 'db_alias': 'testdbA',
19 }
20 uname = StringField(max_length=63)
21 uid = StringField(max_length=64)
22 age = IntField(default=0)
23
24
25 def create_record(uname, uid, age):
26 user = User()
27 user.uname = uname
28 user.uid = uid
29 user.age = age
30 return user
31
32 def print_records(records):
33 # 输出User类此时绑定的db连接名称,并输出其记录个数
34 records = list(User.objects.all())
35 print('{} count:{}, records:'.format(User._meta['db_alias'], len(records)))
36 for rc in records:
37 print(' {}|{}|{}'.format(rc['uname'], rc['uid'], rc['age']))
38
39
40 records = list(User.objects.all())
41 print_records(records)
42 create_record('Ace', 'AX001', 10).save()
43 print_records(records)
44
45 # switch到testdbB连接
46 with switch_db(User, 'testdbB'):
47 print_records(records)
48 create_record('Bob', 'BX001', 11).save()
49 print_records(records)
50
51 # switch到testdbC连接
52 with switch_db(User, 'testdbC'):
53 print_records(records)
54 create_record('Carl', 'CX001', 12).save()
55 print_records(records)