106 lines
2.9 KiB
Python
106 lines
2.9 KiB
Python
from sqlalchemy.orm import Session
|
|
from sqlalchemy import select, update, delete
|
|
from model.wl_score_model import Score
|
|
from model.wl_student_model import Student
|
|
|
|
|
|
def get_score(db: Session, stu_id: int, exam_order: int):
|
|
"""根据学生id+考试批次查询单条成绩"""
|
|
stmt = select(Score).where(
|
|
Score.stu_id == stu_id,
|
|
Score.exam_order == exam_order
|
|
)
|
|
return db.scalar(stmt)
|
|
|
|
|
|
def get_student_by_id(db: Session, stu_id: int):
|
|
"""检测学生是否存在:通过学生id查学生表"""
|
|
return db.scalar(select(Student).where(Student.stu_id == stu_id))
|
|
|
|
|
|
def get_student_by_name(db: Session, stu_name: str):
|
|
"""通过学生姓名查询学生"""
|
|
return db.scalar(select(Student).where(Student.stu_name == stu_name))
|
|
|
|
|
|
def list_score_by_stu_id(db: Session, stu_id: int):
|
|
"""查询一个学生全部成绩,返回列表"""
|
|
stmt = select(Score).where(Score.stu_id == stu_id)
|
|
return db.scalars(stmt).all()
|
|
|
|
|
|
|
|
def create_score(db: Session, stu_id: int, exam_order: int, score: float):
|
|
"""
|
|
新增成绩
|
|
返回:成功返回StudentScore对象;检测不通过返回None
|
|
"""
|
|
# 1.检测:学生是否真实存在学生表
|
|
stu = get_student_by_id(db, stu_id)
|
|
if not stu:
|
|
print("[检测] 学生表无此学生,stu_id=", stu_id)
|
|
return None
|
|
|
|
# 2.检测:该学生该批次成绩是否已经存在(重复新增)
|
|
exist_score = get_score(db, stu_id, exam_order)
|
|
if exist_score:
|
|
print("[检测] 成绩已存在 stu_id=", stu_id, "exam_order=", exam_order)
|
|
return None
|
|
|
|
# 3.构建ORM对象插入数据库
|
|
new_score = Score(
|
|
stu_id=stu_id,
|
|
exam_order=exam_order,
|
|
score=score
|
|
)
|
|
db.add(new_score)
|
|
db.commit()
|
|
db.refresh(new_score)
|
|
return new_score
|
|
|
|
|
|
|
|
def update_score(db: Session, stu_id: int, exam_order: int, new_score: float):
|
|
"""
|
|
更新指定学生指定考试批次的分数
|
|
"""
|
|
# 1.检测学生是否存在
|
|
stu = get_student_by_id(db, stu_id)
|
|
if not stu:
|
|
print("[检测] 更新失败:学生不存在")
|
|
return None
|
|
|
|
# 2.检测这条成绩记录本身是否存在
|
|
score_obj = get_score(db, stu_id, exam_order)
|
|
if not score_obj:
|
|
print("[检测] 更新失败:该学生该批次成绩记录不存在")
|
|
return None
|
|
|
|
# 方案A:直接修改对象属性(推荐)
|
|
score_obj.score = new_score
|
|
db.commit()
|
|
db.refresh(score_obj)
|
|
return score_obj
|
|
|
|
|
|
|
|
|
|
|
|
def delete_score(db: Session, stu_id: int, exam_order: int):
|
|
"""删除某个学生某一次考核成绩"""
|
|
# 检测记录是否存在
|
|
score_obj = get_score(db, stu_id, exam_order)
|
|
if not score_obj:
|
|
print("[检测] 删除失败,记录不存在")
|
|
return False
|
|
|
|
stmt = delete(Score).where(
|
|
Score.stu_id == stu_id,
|
|
Score.exam_order == exam_order
|
|
)
|
|
db.execute(stmt)
|
|
db.commit()
|
|
return True
|
|
|
|
|