Files
max_code_test_gitea_2/dao/teacher_dao.py
T
2026-09-14 11:51:13 +08:00

143 lines
5.3 KiB
Python
Raw 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/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