前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >tornado 使用peewee-async 完成异步orm数据库操作

tornado 使用peewee-async 完成异步orm数据库操作

作者头像
编程黑洞
发布于 2023-03-06 11:51:15
发布于 2023-03-06 11:51:15
94900
代码可运行
举报
文章被收录于专栏:编程黑洞编程黑洞
运行总次数:0
代码可运行

# 简介

tornado是一个异步web框架,其中不能使用阻塞的操作,不然会导致整个程序的阻塞。数据库操作时不可避免的需要使用,这里采用的是peewee-async去解决。

peewee-async 是一个为 peewee orm框架提供异步接口的库。

该项目的github地址: tornado_learning.git (opens new window)

# 配置

在settings.py文件中创建连接数据库 代码: server.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import peewee_async

database = peewee_async.MySQLDatabase("tornado_learning", "127.0.0.1", port=3306, user="root", password="root1234")

在server.py中引用数据库连接,并加入到app中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from peewee_async import Manager
from tornado import web, ioloop

from tornado_learning.settings import database
from tornado_learning.settings import settings
from tornado_learning.urls import urlpattern


def make_app():    
    app = web.Application(urlpattern, debug=True, **settings)    
    
    # 就在这里添加数据库连接
    objects = Manager(database)    
    
    # 禁止使用同步操作
    database.set_allow_sync(False)    
    app.objects = objects    
    return app

if __name__ == '__main__':   
    app = make_app()   
    app.listen(8888)    
    ioloop.IOLoop.current().start()

# 创建model

创建通用的BaseModel类 create_time是每个model都需要的字段,将两个字段提取到BaseModel中。 id字段在peewee中会为每个model自动创建。 为每一个model指定database 在配置目录tornado_learning中创建model.py

代码: tornado_learning/models

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from datetime import datetime

from peewee import Model, DateTimeField

from tornado_learning.settings import database

class BaseModel(Model):   
    create_time = DateTimeField(default=datetime.now, verbose_name="创建时间")    
    class Meta:        
        database = database

创建model类

这里的student和teacher的关系是1对多。

创建student的模型类。 代码: apps/school/models.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from peewee import CharField, IntegerField, TextField
from tornado_learning.models import BaseModel

class Student(BaseModel):    
    name = CharField(max_length=100, null=False, verbose_name="学生名")    
    age = IntegerField(null=False, verbose_name="年龄")    
    desc = TextField(verbose_name="个人简介")

创建teacher的模型类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Teacher(BaseModel):    
    student = ForeignKeyField(rel_model=Student, related_name="teachers")    
    name = CharField(max_length=100, null=False, verbose_name="老师名")   
    age = IntegerField(null=False, verbose_name="年龄")   
    subject = CharField(max_length=100, null=False, verbose_name="学科")

使用工具类创建表tools/init_db.py中初始化表。 运行该文件即可在数据库中创建表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from tornado_learning.settings import database
from apps.school.models import Student

def init_db():    
    database.create_tables([Student, student])

if __name__ == '__main__':    
    init_db()

# 增删改查

下面是增删改查的例子。

form表单的使用可以参考我的文章<<tornado 结合wtforms使用表单操作

代码: apps/school/handler.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tornado

from apps.school.forms import StudentForm
from apps.school.models import Student
from tornado_learning.handler import BaseHandler

class StudentHandler(BaseHandler):

    async def get(self):
        id = self.get_argument("id", None)
        if not id:
            return self.write("please provide the 'id'")

        student = await self.application.objects.get(Student, id=id)

        try:
            self.write({
                "id": student.id,
                "name": student.name
            })
        except Student.DoesNotExist:
            raise tornado.webHttpError(404, "Object not found")

    async def post(self):

        student_form = StudentForm(self.request.arguments)
        if student_form.validate():
            await self.application.objects.create(Student, **student_form.data)

            self.write("创建成功")
        else:
            self.write("校验失败")

    async def delete(self):
        id = self.get_argument("id", None)
        if not id:
            return self.write("please provide the 'id'")

        student = await self.application.objects.get(Student, id=id)
        await self.application.objects.delete(student)

        self.write("删除成功")

    async def put(self):
        studentForm = StudentForm(self.request.arguments)

        student = Student(**studentForm.data)

        if studentForm.validate():
            await self.application.objects.update(student)
            self.write("更新成功")
        else:
            print(studentForm.errors)

# 连表查询

teacher model中添加extend方法,拼凑连表查询的方法,方便使用。 代码: apps/school/model.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Teacher(BaseModel):
    student = ForeignKeyField(rel_model=Student, related_name="teachers")
    name = CharField(max_length=100, null=False, verbose_name="老师名")
    age = IntegerField(null=False, verbose_name="年龄")
    subject = CharField(max_length=100, null=False, verbose_name="学科")

    @classmethod
    def extend(cls):
        return cls.select(cls, Student.name, Student.age).join(Student)

使用peewee拼凑出查询,然后通过异步执行得到结果 代码: apps/school/handler.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class TeacherHandler(BaseHandler):

    async def get(self):
        ret_data = {"data": []}

        teacher_query = Teacher.extend()
        teacher_query = teacher_query.filter(Teacher.age > 20)
        teachers = await self.application.objects.execute(teacher_query)

        for teacher in teachers:
            item_dict = {
                "teacher_name": teacher.name,
                "teacher_age": teacher.age,
                "student_name": teacher.student.name,
                "student_age": teacher.student.age
            }
            ret_data['data'].append(item_dict)

        return self.finish(ret_data)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
tornado 结合wtforms使用表单操作
在获取请求时,需要将请求的参数进行验证。 使用wtforms和tornado的结合,可以获取到请求的参数,并且对参数进行验证。
编程黑洞
2023/03/06
4430
tornado 用户密码 bcrypt加密
该项目的github地址: tornado_learning.git (opens new window)
编程黑洞
2023/03/06
1.1K0
Django 使用 ORM 操作数据库详解
在python中的一个默认的编写规范是一切皆对象,这样做使得代码简洁,结构清晰,便于维护和重用代码,同时极大的提升开发效率。
白墨石
2021/01/12
8480
tornado 使用jwt完成用户异步认证
在使用特定功能时,需要验证用户是否登录。使用jwt将用户不敏感的信息保存在客户端上,然后访问时,将加密的信息发送给服务端验证。
编程黑洞
2023/03/06
4580
python测试开发django-38.ManyToMany查询
同步之后数据库里面会新增三张表:student、teacher、student_teachers
上海-悠悠
2019/05/06
7630
python测试开发django-38.ManyToMany查询
Django 之 Models(Models 模型 & 数据表关系)
<font color="red">欢迎阅读本专栏其他文章</font> Django 之路由篇 Django 之视图篇 Django 之模板篇 Models 模型 ORM --- ObjectRelationMap: 把面向对象思想转换成关系数据库思想,操作上把类等价于表格 类对应表格 类中的属性对应表中的字段 在应用中的models.py 文件中定义class 所有需要使用ORM的class都必须是 models.Model 的子类 class 中的所有属性对应表格中的字段 字段的类型都必须使用 mod
ruochen
2021/05/12
2.4K0
Django 之 Models(Models 模型 & 数据表关系)
Django实践-03模型-01表生成模型+学科页面与教师页面编写
官网:https://www.djangoproject.com/ 博客:https://www.liujiangblog.com/
用户2225445
2023/10/16
2200
Django实践-03模型-01表生成模型+学科页面与教师页面编写
Python Tornado搭建高并发R
使用peewee提供的ORM,编写数据库基类,默认添加两个字段,添加时间和更新时间,如下:
py3study
2020/01/17
2.4K0
Django 多数据库配置与使用总结
https://www.djangoproject.com/download/2.0.13/tarball/
授客
2020/12/16
2.8K0
【Python全栈100天学习笔记】Day43 Django静态资源与Ajax请求
基于前面的知识,我们已经可以使用Django框架来完成Web应用的开发了。接下来我们就尝试实现一个投票应用,具体的需求是用户进入应用首先查看到“学科介绍”页面,该页面显示了一个学校所开设的所有学科;通过点击某个学科,可以进入“老师介绍”页面,该页面展示了该学科所有老师的详细情况,可以在该页面上给老师点击“好评”或“差评”;如果用户没有登录,在投票时会先跳转到“登录页”要求用户登录,登录成功才能投票;对于未注册的用户,可以在“登录页”点击“新用户注册”进入“注册页”完成用户注册操作,注册成功后会跳转到“登录页”,注册失败会获得相应的提示信息。
天道Vax的时间宝藏
2022/04/02
5030
【Python全栈100天学习笔记】Day43 Django静态资源与Ajax请求
Django-models & QuerySet API
IntegerField  – 整型 BooleanField  – 布尔值类型 NullBooleanField  – 可以为空的布尔值 CharField     – 字符串类型 必须提供max_length参数,字符长度 TextField      – 文本类型 EmailField     – 一个带有检查 Email 合法性的 CharField GenericIPAddressField      IP地址 URLField        URL类型 SlugField  – 字符串类型,只包含字母,数字,下划线或连字符 CommaSeparatedIntegerField   – 字符串类型,格式必须为逗号分割的数字 UUIDField   uuid类型 DateTimeField     – 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] DateField   – 日期格式 YYYY-MM-DD TimeField   – 时间格式 HH:MM[:ss[.uuuuuu]] FloatField(Field)    – 浮点型 DecimalField(Field)   – 10进制小数 BinaryField(Field)    – 二进制类型
kirin
2020/07/23
1.5K0
基于Sanic的微服务基础架构
介绍 使用python做web开发面临的一个最大的问题就是性能,在解决C10K问题上显的有点吃力。有些异步框架Tornado、Twisted、Gevent 等就是为了解决性能问题。这些框架在性能上有些提升,但是也出现了各种古怪的问题难以解决。 在python3.6中,官方的异步协程库asyncio正式成为标准。在保留便捷性的同时对性能有了很大的提升,已经出现许多的异步框架使用asyncio。 使用较早的异步框架是aiohttp,它提供了server端和client端,对asyncio做了很好的封装。但是
Python中文社区
2018/03/26
3.8K0
基于Sanic的微服务基础架构
Python:logging.NullHandler 的使用
关于 logging.NullHandler,网上大多数的解释就一句话:该 Handler 实例会忽略 error messages,通常被想使用 logging 的 library 开发者使用来避免'No handlers could be found for logger XXX'信息的出现。
丹枫无迹
2019/01/22
6670
Django开发在线教育平台--学习整理(一)
首先,打开cmd,cd到存放django项目的文件夹,创建一个新工程(也可以用虚拟环境virtualenv):
SimonDM
2018/05/09
3.1K4
Django开发在线教育平台--学习整理(一)
零基础使用Django2.0.1打造在线教育网站(八):数据库字段的定义(下)
努力与运动兼备~有任何问题可以加我好友或者关注微信公众号,欢迎交流,我们一起进步!
啃饼思录
2018/08/21
8850
Python 进阶(四):数据库操作之 MySQL
MySQL 是目前使用最广泛的数据库之一,它有着良好的性能,能够跨平台,支持分布式,能够承受高并发。如果还没有安装 MySQL,下载地址:https://dev.mysql.com/downloads/mysql/5.7.html,安装参考:https://jingyan.baidu.com/article/fc07f989b298ca12ffe519b6.html。
Python小二
2020/08/18
1.1K0
Django+xadmin打造在线教育平台(一)
代码 github下载  一、前言 代码下载:  开发环境:     python:  3.6.4     Django: 2.0.2 后台管理:xadmin 1.1.项目介绍 系统概括: 系统具有完整的用户登录注册以及找回密码功能,拥有完整个人中心。 个人中心: 修改头像,修改密码,修改邮箱,可以看到我的课程以及我的收藏。可以删除收藏,我的消息。 导航栏: 公开课,授课讲师,授课机构,全局搜索。 点击公开课–> 课程列表,排序-搜索。热门课程推荐,课程的分页。 点击课程–> 课程详情页中对课程进行收藏,
zhang_derek
2018/04/11
5.8K1
Django+xadmin打造在线教育平台(一)
Django model 层之Models与Mysql数据库小结
下载地址:https://www.python.org/downloads/release/python-340/
授客
2020/07/22
2.3K0
Python进阶40-drf框架(二)
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
2.1K0
Python进阶40-drf框架(二)
测试开发进阶(三十四)
数据库模型图 创建app 根据上面的数据库设计,创建9个app configures debugtalks envs interfaces projects reports testsuits tes
zx钟
2019/11/07
5150
测试开发进阶(三十四)
相关推荐
tornado 结合wtforms使用表单操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验