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