mongo的python异步驱动---motor

motor 是mongo 的python异步驱动,它提供了基于协程的API,可以用于从tornado, asyncio 访问mongo数据库,它依赖于PyMongo,可以使用pip对它进行安装

pip3 install motor 

下表是他们motor与PyMongo的版本适配关系
motor与PyMongo版本适配

motor 与mongo之间也存在一个版本适配关系
motor与mongo版本适配

同理,motor 与 python版本之间也存在版本适配关系
motor与python版本适配

2. 一个简单的查询示例

利用在第一节部署mongo过程中新建的账号和数据库,我编写下面的简单查询示例

import asyncio
import motor.motor_asyncio

uri = "mongodb://kwsy:123456@localhost:27017/app"
client = motor.motor_asyncio.AsyncIOMotorClient(uri)

db = client.app
print(db)

async def do_find_one():
    document = await db.user.find_one({})
    pprint.pprint(document)


loop = asyncio.get_event_loop()
loop.run_until_complete(do_find_one())

由于我设置了权限认证,因此必须在创建连接时在uri中设置用户名和密码,我的示例要配合asyncio 来使用,因此必须使用motor.motor_asyncio, 如果是在tornado中使用,则需要引入motor.motor_tornado。

使用async/await 保留关键字进行异步编程已经非常方便,几乎与同步代码没有差异,只是注意在调用异步方法时使用await ,所有使用了await的关键字的函数必须使用async 进行声明。

运行do_find_one,你不能用下面的方式

asyncio.run(do_find_one())

而是要使用我示例中的方式

loop = asyncio.get_event_loop()
loop.run_until_complete(do_find_one())

按理说,这两种方式在执行协程方面是等价的,但实践起来,run方法就是不可行,至于原因,目前还没有研究请求。

扫描关注, 与我技术互动

QQ交流群: 211426309

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案