Files
sqlalchemy_fastapi_demo_1/dao/students_dao.py
T

116 lines
4.0 KiB
Python

# dao/students_dao.py
# 本文件封装对 model 表的所有数据库操作(增、删、改、查)
from sqlalchemy.orm import Session
from fastapi import HTTPException
from sqlalchemy_fastapi_demo_1.model.c_lass import Classinfo
from sqlalchemy_fastapi_demo_1.model.advisors import Advisor
from sqlalchemy_fastapi_demo_1.model.students import Student
from sqlalchemy_fastapi_demo_1.scheme.students import StudentCreate, StudentUpdate
from typing import Optional, List
class StudentDAO:
@staticmethod
def inspect_class_id_unq(db: Session, class_id: int):
"""校验班级是否存在:去 c_lass 表查"""
return db.query(Classinfo).filter(Classinfo.class_id == class_id).first()
@staticmethod
def inspect_advisor_id_unq(db: Session, advisor_id: int):
"""校验顾问是否存在:去 advisors 表查"""
return db.query(Advisor).filter(Advisor.advisor_id == advisor_id).first()
@staticmethod
def create_student(db: Session, obj_in: StudentCreate):
"""新增学生,检查学号唯一性"""
exist = db.query(Student).filter(Student.stu_id == obj_in.stu_id).first()
# 只按 stu_id 判断,且包含逻辑删除的记录
if exist:
if exist.is_deleted == 1:
raise HTTPException(status_code=400, detail="该学号已被占用(处于逻辑删除状态),请先恢复")
raise HTTPException(status_code=400, detail="该学生已存在")
db_obj = Student(**obj_in.model_dump())
try:
db.add(db_obj)
db.commit()
db.refresh(db_obj)
except Exception:
db.rollback()
raise
return db_obj
@staticmethod
def get_students_all(db: Session, skip: int = 0, limit: int = 100):
"""分页查询全部学生"""
return db.query(Student).filter(Student.is_deleted == 0).offset(skip).limit(limit).all()
@staticmethod
def get_student_by_id(db: Session, stu_id: int):
"""根据学生编号单条查询"""
return db.query(Student).filter(Student.is_deleted == 0,
Student.stu_id == stu_id).first()
@staticmethod
def query_multi_condition(
db: Session,
stu_id: Optional[int] = None,
stu_name: Optional[str] = None,
class_id: Optional[int] = None,
skip: int = 0,
limit: int = 100
) :
q = db.query(Student).filter(Student.is_deleted == 0)
"""多条件选择性查询"""
# 只有参数不为None的时候,才加上查询条件
if stu_id is not None:
q = q.filter(Student.stu_id == stu_id)
if stu_name is not None:
q = q.filter(Student.stu_name.like(f"%{stu_name}%"))
if class_id is not None:
q = q.filter(Student.class_id == class_id)
q = q.offset(skip).limit(limit)
return q.all()
@staticmethod
def update_student(db: Session,stu_id:int, obj: StudentUpdate):
db_obj = db.query(Student).filter(Student.stu_id == stu_id,
Student.is_deleted == 0).first()
if not db_obj:
raise HTTPException(status_code=404, detail="学生数据不存在或已删除")
update_data = obj.model_dump(exclude_unset=True)
for field, value in update_data.items():
setattr(db_obj, field, value)
try:
db.commit()
db.refresh(db_obj)
except Exception:
db.rollback()
raise
return db_obj
@staticmethod
def delete_student(db: Session, stu_id: int):
db_obj = db.query(Student).filter(Student.stu_id == stu_id,
Student.is_deleted == 0).first()
if not db_obj:
raise HTTPException(status_code=404, detail="学生数据不存在或已删除")
db_obj.is_deleted = 1
try:
db.commit()
db.refresh(db_obj)
except Exception:
db.rollback()
raise
return True # 返回布尔值,而不是 dict