motor 是mongo 的python异步驱动,它提供了基于协程的API,可以用于从tornado, asyncio 访问mongo数据库,它依赖于PyMongo,可以使用pip对它进行安装
pip3 install motor
下表是他们motor与PyMongo的版本适配关系
motor 与mongo之间也存在一个版本适配关系
同理,motor 与 python版本之间也存在版本适配关系
利用在第一节部署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