146 lines
5.4 KiB
Python
146 lines
5.4 KiB
Python
# dao/teacher_dao.py
|
||
# 本文件封装对 tes_info 表的所有数据库操作(增、删、改、查)
|
||
from http.client import HTTPException
|
||
from typing import List, Optional
|
||
|
||
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 |