68 lines
3.1 KiB
Python
68 lines
3.1 KiB
Python
# dao/teachers_dao.py
|
|
# 本文件封装对 Teacher 表的所有数据库操作(增、删、改、查)
|
|
from sqlalchemy.orm import Session
|
|
from sqlalchemy_fastapi_demo_1.scheme.teachers import TeacherAdd, TeacherUpdate
|
|
from sqlalchemy_fastapi_demo_1.model.teachers import Teacher
|
|
from sqlalchemy_fastapi_demo_1.model.c_lass import Classinfo
|
|
|
|
class TeacherDAO:
|
|
@staticmethod
|
|
def add_teacher(db:Session,teacher_data:TeacherAdd): # 前端返回的teacher_data是1个Pydantic对象
|
|
db_teacher=Teacher(**(teacher_data.model_dump()))
|
|
db.add(db_teacher)
|
|
db.commit()
|
|
db.refresh(db_teacher)
|
|
return db_teacher
|
|
@staticmethod
|
|
def inspect_teacher_id_unq(db: Session, teacher_id: int):
|
|
"""
|
|
根据教师ID获取教师对象(用于主键唯一性检查,查询结果包含被软删除的对象)
|
|
"""
|
|
return db.query(Teacher).filter(Teacher.teacher_id == teacher_id).first()
|
|
@staticmethod
|
|
def inspect_class_id_unq(db: Session, class_id: int):
|
|
"""
|
|
根据班级ID获取班级对象(用于外键检查,查询结果排除被软删除对象,即不包括is_deleted=1的对象)
|
|
"""
|
|
return db.query(Classinfo).filter(Classinfo.class_id == class_id,Classinfo.is_deleted==0).first()
|
|
@staticmethod
|
|
def delete_light(db: Session, teacher_id: int):
|
|
"""
|
|
删除教师
|
|
:return: True 表示删除成功,False 表示教师ID不存在,已被软删除或硬删除
|
|
"""
|
|
db_teacher = TeacherDAO.inspect_teacher_id_unq(db, teacher_id)
|
|
if (not db_teacher) or db_teacher.is_deleted==1:
|
|
return False
|
|
db_teacher.is_deleted=1 # 标记为1逻辑删除
|
|
db.commit() # 提交事务
|
|
return True
|
|
|
|
@staticmethod
|
|
def update(db: Session,teacher_id:int,teacher_data: TeacherUpdate):
|
|
"""
|
|
更新用户信息(只更新传入的非空字段)
|
|
:param db: 数据库会话
|
|
:param teacher_data: 包含要更新字段的 Pydantic 模型
|
|
:return: 更新后的 User 对象,如果用户不存在则返回 None
|
|
"""
|
|
# 只更新客户端显式传入的字段(exclude_unset=True 排除未设置的字段,不排除设置了None的字段)
|
|
update_data = teacher_data.model_dump(exclude_unset=True) # 返回要更新字段的字典
|
|
db_teacher=TeacherDAO.inspect_teacher_id_unq(db, teacher_id)
|
|
for key, value in update_data.items():
|
|
setattr(db_teacher, key, value) # 动态设置属性
|
|
db.commit() # 提交事务
|
|
db.refresh(db_teacher) # 刷新对象,获取 onupdate 时间等
|
|
return db_teacher
|
|
@staticmethod
|
|
def get_all(db: Session, skip: int = 0, limit: int = 100):
|
|
"""
|
|
获取所有用户(支持分页,不显示软删除)
|
|
:param db: 数据库会话
|
|
:param skip: 偏移量(跳过前 skip 条,从skip+1条开始返回)
|
|
:param limit: 最大返回条数
|
|
:return: 用老师对象列表
|
|
"""
|
|
return db.query(Teacher).filter(Teacher.is_deleted==0).offset(skip).limit(limit).all()
|
|
|