上面学习的peewee是同步的ORM框架,如果我们想在tornado中使用,我们需要异步的ORM。
peewee-async是将peewee变成异步的一个库
import asyncio
import peewee
import peewee_async
# Nothing special, just define model and database:
# 定义数据库连接和 peewee 一样
database = peewee_async.MySQLDatabase(
'message',
host="127.0.0.1",
port=3306,
user="root",
password="root"
)
# 创建模型和之前一样
class TestModel(peewee.Model):
text = peewee.CharField()
class Meta:
database = database
# Look, sync code is working!
# 同步的方式创建数据库
TestModel.create_table(True)
TestModel.create(text="Yo, I can do it sync!")
database.close()
# 如果我们想异步使用 则是需要创建一个 Manager 以后执行 SQL 语句都是靠这个 Manager
objects = peewee_async.Manager(database)
# 将同步禁用
database.set_allow_sync(False)
async def handler():
# 使用协程的方式来操作 进行数据库操作需要使用 我们创建的 Manager 实例
await objects.create(TestModel, text="Not bad. Watch this, I'm async!")
all_objects = await objects.execute(TestModel.select())
# objects 负责真正的执行 SQL objects.execute() 返回的是一个协程对象 一定要使用 await
for obj in all_objects:
print(obj.text)
loop = asyncio.get_event_loop()
loop.run_until_complete(handler())
# loop.close()
# run_until_complete 执行完之后自动调用 close
with objects.allow_sync():
TestModel.drop_table(True)
# Expected output:
# Yo, I can do it sync!
# Not bad. Watch this, I'm async!
参考链接:https://www.jianshu.com/p/a2e0a3975cb5
https://www.cnblogs.com/crazymagic/articles/10188327.html