# dao/teacher_dao.py # 本文件封装对 tes_info 表的所有数据库操作(增、删、改、查) from sqlalchemy import or_ from sqlalchemy.orm import Session from model.cls_mgmt_model import ClsMgmt from model.teacher_model import Teacher from scheme.teacher_scheme import TeacherUpdate, TeacherAdd import random class TeacherDao: """教师数据访问对象,所有方法均为静态方法,方便调用""" #获取所有教师基本信息 @staticmethod def get_all(db: Session, skip: int = 0, limit: int = 100) : """ 获取所有用户(支持分页) :param db: 数据库会话 :param skip: 偏移量(跳过前 skip 条) :param limit: 最大返回条数 :return: 教师对象列表 """ return db.query(Teacher).filter(Teacher.is_deleted == 0).offset(skip).limit(limit).all() #获取单个教师信息 @staticmethod def get_by_id(db: Session, teacher_id: str) : """ 根据主键 ID 获取单个教师信息 :return:教师对象或 None """ return db.query(Teacher).filter(Teacher.id == teacher_id,Teacher.is_deleted == 0).first() @staticmethod def get_by_name(db: Session, teacher_name: str) : """ 根据教师姓名获取信息(用于唯一性检查) """ return db.query(Teacher).filter(Teacher.name == teacher_name,Teacher.is_deleted == 0).first() # 根据教师id获取教师带教班级信息 @staticmethod def get_clss_info(db: Session, teacher_id: str): """ 根据主键 ID 获取单个教师信息 :return: 带教信息或 None """ return db.query(ClsMgmt).filter(or_(ClsMgmt.head_tea_id == teacher_id,ClsMgmt.lecturer_id == teacher_id), ClsMgmt.is_deleted == 0).all() #添加教师 @staticmethod def add(db: Session, teacher_data: TeacherAdd) : """ 添加新教师 :param db: 数据库会话 :param teacher_data: 符合 TeacherAddUpdate 请求体模型的数据 :return: 创建后的 teacher 对象(含id ) """ # 教师id自动生成 格式:T+随机四位数 并进行重复验证 while True: new_id = f"T{random.randint(100, 999)}" # 确保是4位数,不会出现 0012 这种情况 # 查询数据库是否已存在这个 id exists = db.query(Teacher).filter(Teacher.id == new_id).first() if not exists: break # 不存在,跳出循环,使用这个 id # 把传入的参数变成字典 data_dict = teacher_data.model_dump() # 把生成id加到字典里 data_dict["id"] = new_id #软删除逻辑is_delete默认为0 data_dict["is_deleted"] = 0 # 将 Pydantic 模型转为字典,并解包构建 SQLAlchemy 模型实例 # 对字典进行拆包变成Teacher(id='',name='', phone='', type='',is_delete='0') db_teacher = Teacher(**data_dict) db.add(db_teacher) # 添加到会话 db.commit() # 提交事务,此时会执行 INSERT,并自动填充自增字段 db.refresh(db_teacher) # 刷新对象,获取数据库生成的默认值(如 created_at) return db_teacher #更新教师信息 @staticmethod def update(db: Session, teacher_id: str, teacher_data: TeacherUpdate) : """ 更新教师信息(只更新传入的非空字段) :param db: 数据库会话 :param teacher_id: 要更新的教师 ID :param teacher_data: 包含要更新字段的 Pydantic 模型 :return: 更新后的 Teacher 对象,如果没有此教师则返回None """ db_teacher = TeacherDao.get_by_id(db, teacher_id) if not db_teacher: return None # 只更新客户端显式传入的字段(exclude_unset=True 排除未设置的字段) # 不加 exclude_unset=True;teacher_data.model_dump() 会输出所有字段,没传的字段值是 None: # 将传入参数转变成字典 update_data = teacher_data.model_dump(exclude_unset=True) #如果不传数据,直接返回本id教师 if not update_data: return db_teacher #拆分遍历传入的数据 for key, value in update_data.items(): #滚动插入数据 动态赋值 setattr(db_teacher, key, value) """" 不使用setattr的写法 if 'name' in update_data: db_teacher.name = update_data['name'] if 'phone' in update_data: db_teacher.phone = update_data['phone'] if 'type' in update_data: db_teacher.type = update_data['type'] """ db.commit() # 提交事务 db.refresh(db_teacher) # 刷新对象,获取 onupdate 时间等 return db_teacher # 通过id删除教师 @staticmethod def delete(db: Session, teacher_id: str): db_teacher = TeacherDao.get_by_id(db, teacher_id) #如果不存在返回None,供接口判断 if not db_teacher: return None #存在的情况下,只需把is_delete改成1 db_teacher.is_deleted = 1 #软删除,1代表已删除 # db.delete(db_teacher) # 正常删除 db.commit() # 提交事务 db.refresh(db_teacher) return True