Files
sqlalchemy_fastapi_demo_1/dao/c_lass.py
T

69 lines
3.7 KiB
Python
Raw Normal View History

2026-09-21 19:15:28 +08:00
# # dao/c_lass.py 数据访问层,直接操作数据库
# # 本文件封装对 Classinfo表的所有数据库操作(增、删、改、查)
from sqlalchemy.orm import Session # 会话类型,标注db参数
from sqlalchemy_fastapi_demo_1.model.c_lass import Classinfo # # 导入ORM模型
from sqlalchemy_fastapi_demo_1.scheme.c_lass import ClassCreate, ClassUpdate # 导入入参模型
from typing import Optional, List # 类型注解用:Optional=可空,List=列表
# 新增班级
def create_c_lass(db: Session, obj: ClassCreate):# 新增函数:接收会话db和校验后的数据obj,返回Classinfo对象
db_obj = Classinfo(class_id=obj.class_id, start_time=obj.start_time)
# 把前端传来的数据组装成一个ORM对象(相当于内存里的一条新记录)
db.add(db_obj) # 把对象加入会话
db.commit() # 提交事务:真正把INSERT语句发给MySQL执行,写进数据库
db.refresh(db_obj) # 从数据库重新查一遍这条记录,把数据库自动生成的值(如默认值)刷新回对象
return db_obj # 返回这个对象,方便API层序列化成JSON返回前端
# 根据 id 查询单个班级:只查询 is_deleted=0 未删除
def get_c_lass(db: Session, class_id: int) -> Optional[Classinfo]:
# 按ID查单个班级;Optional = 可能查不到(返回None)
return db.query(Classinfo).filter(
Classinfo.class_id == class_id,# 条件1:班级编号等于传入的id
Classinfo.is_deleted == 0 # 条件2:没被逻辑删除(只查0)
).first()
# .first() = 取第一条;查不到就返回None,不会报错
# 分页查询所有班级:过滤已经逻辑删除的数据
def get_all_c_lass(db: Session, skip: int = 0, limit: int = 100) -> List[Classinfo]:
# 分页查所有班级:skip=跳过几条,limit=最多取几条
return db.query(Classinfo)\
.filter(Classinfo.is_deleted == 0)\
.offset(skip).limit(limit).all() # # 只查没删的; 跳过skip条,取limit条,返回列表
# 修改班级(局部更新:传了哪个字段就改哪个)
def update_c_lass(db: Session, class_id: int, update_obj: ClassUpdate):
# 修改函数:按id找到班级,把传进来的字段改掉
db_class = get_c_lass(db, class_id)
# 只取前端真正传了的字段
update_data = update_obj.model_dump(exclude_unset=True)
# 把前端传的修改数据转成字典;exclude_unset=True = 只保留前端真正传了的字段
# (没传的字段不出现,就不会被误改成None——就是"局部更新")
for key, value in update_data.items():# 循环:把字典里每个字段的值,赋给ORM对象对应属性(内存里改好)
setattr(db_class, key, value)
db.commit() # 提交:把改动写进数据库
db.refresh(db_class) # 从数据库重新查询这条记录,把数据库里的最新值刷新到 Python 对象上,让内存里的对象和数据库保持一致。
return db_class # 返回改好的对象
# 逻辑删除:不再db.delete,设置is_deleted=1
def delete_c_lass(db: Session, class_id: int) -> bool:
# 删除函数:不是物理删除(不删数据库行),是打标记
db_class = get_c_lass(db, class_id) # 先查这条班级
if not db_class:
return False # 查不到返回False,API层返回404
# 打删除标记
db_class.is_deleted = 1 # 把逻辑删除标记改成1(=已删除
db.commit()
return True # 返回True表示删除成功
#DAO 层是所有 SQL 的家,API 层不写任何 SQL,只调这里的函数。
# 查询统一过滤 `is_deleted == 0`,删了的数据还在数据库里,只是查不到 —— 这就是逻辑删除。