数据库操作
10.1 数据准备
10.1.3 表关系说明
我们准了两张表Books (图书) 表 和 Characters (人物) 表,两张表的关系是一对多的关系
| 表名称 | 描述 | 关键字段 |
|---|---|---|
Books |
图书信息,是关系中的“一”方。 | book_id (主键) |
Characters |
人物信息,是关系中的“多”方。 | char_id (主键) |
| 关系类型 | 描述 |
|---|---|
| 一对多 (1:N) | 一本图书(Books)可以包含多位人物(Characters)。 |
| 外键 | 关系通过 Characters 表中的 book_id 字段实现,该字段引用了 Books 表中的 book_id 主键。 |
从多到一:要找到某个人物(例如“郭靖”)所属的书,只需查看该人物记录中的 book_id。
从一到多:要找到某本书(例如《射雕英雄传》)中的所有人物,只需查询 Characters 表中所有 book_id 等于该书 ID 的记录。
10.1.2 建表
使用SQL语句建表,方便写入测试数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 | |
10.1.3 定义模型类
在models.py文件下增加编写如下代码
10.2 单表操作
10.2.1 数据查询
数据写格式:
- db.execute是指定异步执行
I. 查询所有数据

II.单一过滤条件
书写格式:
- 返回所有过滤结果
- result.scalars().all()

- 返回单条过滤结果
- result.scalar_one_or_none()

观察两种方法在返回结果的结构上有什么不同?
III.多条件过滤
书写格式:
根据作者和时代查询

IV.like模糊查询
书写格式:
- like操作符通常与两个通配符一起使用:
%:代表零个、一个或多个字符_:代表一个单个字符like("%@gmail.com")会匹配所有以"@gmail.com"结尾的字符串,例如"example@gmail.com"。
查询罗开头的作者的图书

V.与或非查询
使用符号
|代表或&代表与~代表非
查询id大于4 或 时代是清朝的

VI.in包含查询
书写格式:
查询id包含1234的图书
10.2.2 聚合计算
书写格式:
使用func模块提供的函数进行计算
10.2.4 分页查询
offset表示跳过的记录数,也就是从第几条数据数据开始,limit 表示返回的记录数,也就是返回多少条数据
分页的固定写法,替换不同数据表

10.2.3 添加数据
需要使用post方法进行数据的提交,借助pycharm的http工具
- 定义验证类
- 为了保证数据安全,定义一个pydantic数据验证
- 编写一个schema.py文件
- main.py使用add方法添加
- http文件的代码


10.2.4 更新数据
需要使用put方法进行数据的提交,借助pycharm的http工具
- 定义验证类
- 为了保证数据安全,定义一个pydantic数据验证
- 因为更新可能更新一个或多个字段,所以验证时,允许字段为空
- 编写一个schema.py文件
- main.py
- http文件

10.2.4 数据删除
- main.py文件中 使用delete方法
- http文件

10.2 关联表操作
图书表和人物表存在一对多的关联关系,可以使用join关联方法查询数据
书写格式:
查询某本图书中包含的人物有哪些