# # 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`,删了的数据还在数据库里,只是查不到 —— 这就是逻辑删除。