29 选课系统之ORM查询操作

内容目录

tortoise ORM具体操作

29 选课系统之ORM查询操作

学生选课为例

先手动在class表中添加几条记录,用insert也好、用pycharm的数据库插件也好、用navicat也好

id 班级
13 计算机1班
14 计算机2班
15 软件1班

teacher表也添加几条记录

id name pwd tno
11 xhs 123 1
22 dhs 456 2

course表也添加几条记录

id name teacher_id
6 python开发 11
7 操作系统原理 22

student也添加

id name pwd sno class
1 tom tom666 202501 13
2 jerry jerry666 202502 14
3 tafei tafei666 202503 14

student_course表添加

student_id course_id
2 6
2 7
3 7
  • 查询所有学生

在students_api.py文件中编辑,先导入我们定义的模型:

from mymodels import *

然后在查询所有学生的函数(可能是get_all_students)下面,进行tortoise ROM的查询操作:

students = Student.all()
# 查询所有记录,students是queryset的数据类型,可以遍历,
# 一张表相当于一个类,一条记录相当于一个对象的实例化
# 遍历的时候需要注意,不可以直接 for student in students: pass
# 这里需要变成异步任务,不然会报错
函数名前加上async,Student.all()前面加上await
async def get_all_students():
    students = await Student.all()
    ... ...

过滤查询filter,返回的还是QuerySet,就算其中只有一个元素,也得按照元素位置取值或者遍历

# students = await Student.filter(name="tom")
students = await Student.filter(class_id=13)

过滤查询get,返回模型类对象,不用遍历

student = await Student.get(class_id=13)
# 可以直接使用对象的方法调用属性
print(student.name)

模糊查询

  • 字段+两个下划线+查询符号
    students = await Student.filter(sno__gt=202502)          # sno__gt这里表示大于的意思
    students = await Student.filter(sno__in=[202502,202503]) # 筛选其中的两个
    students = await Student.filter(sno__range=[202501,202503])  # 范围查询

value查询

students = await Student.all().values("name")
students = await Student.filter(sno__gt=202502).values("name","sno")
# 这里就相当于只返回name字段的结果,相当于select name from xxx;
# 返回结果是字典组成的列表,返回多少条记录,该列表中就有多少个字典,
# 字典的格式和你查询的字段相对应,比如[{'name': 'xhs'}, {'name': 'dhs'}]或者
# [{'name': 'xhs', 'sno': 2}, {'name': 'dhs', 'sno': 3}]

发表回复