Files
2026-09-21 19:14:15 +08:00

67 lines
3.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# # dao/c_lass.py 数据访问层,直接操作数据库
# # 本文件封装对 Classinfo表的所有数据库操作(增、删、改、查)
from sqlalchemy.orm import Session # 会话类型,标注db参数
from model.c_lass import Classinfo # # 导入ORM模型
from 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`,删了的数据还在数据库里,只是查不到 —— 这就是逻辑删除。