CRUD 操作
把数据库操作封装成函数,和路由逻辑分开,方便复用和测试。
一、新增(Create)
1.1 基本写法
1.2 逐行拆解
db: Session— 类型提示,告诉编辑器db是一个 SQLAlchemy 会话对象,IDE 能自动补全.add()、.commit()等方法user_in: UserCreate— 类型提示,user_in是一个 Pydantic 模型对象-> User— 返回值类型提示,表示这个函数返回一个UserORM 对象
这行做了两件事,分开看:
第一步:user_in.model_dump()
把 Pydantic 模型转成字典:
第二步:** 字典解包
** 是 Python 的字典解包语法,把字典的键值对展开为关键字参数:
所以完整过程是:
*和**的区别:
*用于列表/元组解包:func(*[1, 2, 3])等价于func(1, 2, 3)**用于字典解包:func(**{'a': 1, 'b': 2})等价于func(a=1, b=2)
db.add(user)— 把对象加入会话(还没写入数据库)db.commit()— 提交事务,真正写入数据库db.refresh(user)— 刷新对象,拿到数据库自动生成的值(如id、created_at)return user— 返回 ORM 对象
1.3 完整流程图
二、查询(Read)
2.1 查询单条
逐步拆解:
-> User | None 是什么意思:
这是 Python 3.10+ 的类型提示语法,表示返回值要么是 User 对象,要么是 None:
User | None 等价于旧写法 Optional[User]。
2.2 查询列表
skip: int = 0— 参数有默认值,不传时默认为 0-> list[User]— 返回一个列表,里面每个元素都是User对象.offset(skip)— 跳过前 N 条(分页用).limit(limit)— 最多返回 N 条.scalars().all()— 取出所有 ORM 对象
2.3 条件查询
常用条件写法:
2.4 排序
2.5 统计数量
等价于 SELECT COUNT(*) FROM users。
.scalar()— 取出单个值(不是 ORM 对象,是普通 Python 值)
三、修改(Update)
3.1 基本写法
3.2 逐行拆解
if not user — 当 user 是 None 时条件成立。Python 中 None 的布尔值为 False,所以 not None 为 True。
exclude_unset=True — 只包含前端实际传了的字段:
.items() 是什么:
字典的方法,返回键值对:
setattr() 是什么:
Python 内置函数,用来设置对象的属性,setattr(obj, name, value) 等价于 obj.name = value:
所以这段循环的意思是:遍历字典,把每个字段的值设置到 user 对象上:
四、删除(Delete)
4.1 基本写法
-> bool— 返回布尔值,True表示删除成功,False表示没找到
4.2 软删除 vs 硬删除
五、Python 语法速查
本节用到的 Python 语法,初学者容易困惑的点:

