Files
DoubaoTeam/dao/student.py
T
2026-09-21 21:39:13 +08:00

104 lines
2.8 KiB
Python

from schemas.student import *
from core.database import get_db
from models.student import *
from sqlalchemy.orm import Session
def create_students(d: dict, db: Session):
stu = Student(**d)
try:
db.add(stu)
# 把 SQL 发给数据库执行
db.flush()
# 根据 id 生成学生编号
if not stu.student_no:
stu.student_no = f"STU{stu.id:04d}"
db.commit()
db.refresh(stu)
return stu
except Exception as e:
db.rollback()
print(f"插入学生失败: {e}")
return None
def get_student_by_id(student_id: int, db: Session):
# 同时判断 is_deleted,已经逻辑删除的学生不会被查到
return db.query(Student).filter(
Student.id == student_id,
Student.is_deleted == 0,
).first()
def update_student(student_id: int, data: dict, db: Session):
# 第一步:先查询学生
student = get_student_by_id(student_id, db)
# 没有查到就返回 None
if not student:
return None
try:
# 第二步:循环修改前端传来的字段
# field 是字段名,value 是新的值
for field, value in data.items():
setattr(student, field, value)
# 第三步:提交修改并重新读取数据
db.commit()
db.refresh(student)
return student
except Exception as e:
# 修改失败时回滚
db.rollback()
print("修改学生失败:", e)
return False
def get_students(
db: Session,
student_no: str | None = None,
student_name: str | None = None,
class_id: int | None = None,
):
# 第一步:只查询没有被删除的学生
query = db.query(Student).filter(Student.is_deleted == 0)
# 第二步:前端传了哪个条件,就增加哪个条件
if student_no:
# 学号使用精确查询
query = query.filter(Student.student_no == student_no)
if student_name:
# 姓名使用模糊查询,例如“张”可以查到“张三”
query = query.filter(Student.student_name.like(f"%{student_name}%"))
if class_id:
# 班级 ID 使用精确查询
query = query.filter(Student.class_id == class_id)
# 第三步:执行查询并返回全部结果
return query.all()
#逻辑删除学生
def delete_student(student_id: int, db: Session):
# 第一步:查询学生
student = get_student_by_id(student_id, db)
if not student:
return None
try:
# 第二步:不真正删除记录,只把删除标记改成 1
student.is_deleted = 1
# 第三步:提交修改
db.commit()
return student
except Exception as e:
# 删除失败时回滚
db.rollback()
print("删除学生失败:", e)
return False