内容目录
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}]