删除 Score.py

This commit is contained in:
2026-09-21 17:09:55 +08:00
parent 1743864918
commit 5464c4649a
-132
View File
@@ -1,132 +0,0 @@
from fastapi import Query, Depends, HTTPException, APIRouter
from sqlalchemy.orm import Session
from sqlalchemy_fastapi_demo.dao.Score import ScoreDAO
from sqlalchemy_fastapi_demo.database import get_db
from sqlalchemy_fastapi_demo.scheme.Score import ScoreCreate, ScoreUpdate
app_score=APIRouter()
# 查询所有成绩
@app_score.get("/",summary='查询所有成绩')
async def get_scores(
skip: int = Query(0, ge=0, description="跳过的记录数"),
limit: int = Query(100, ge=1, le=200, description="返回的最大记录数"),
db: Session = Depends(get_db)
):
scores=ScoreDAO.get_all(db, skip=skip, limit=limit)
return scores
# 查询单个数据
@app_score.get("/{stu_id}/{exam_id}",summary='查询单个成绩')
async def get_score(
stu_id: int,
exam_id: int,
db: Session = Depends(get_db)
):
score=ScoreDAO.get_by_id(db, stu_id,exam_id)
if not score:
raise HTTPException(status_code=404, detail="学生不存在")
return score
# 创建学生
@app_score.post("/",summary='创建学生成绩')
async def create_scores(
score:ScoreCreate,
db: Session = Depends(get_db)
):
# 检查学生在不在学生表
existing_foreign_key=ScoreDAO.inspect_stu_id_unq(db, score.stu_id)
if not existing_foreign_key:
raise HTTPException(status_code=404, detail="该学生不存在")
if existing_foreign_key.is_deleted == 1:
raise HTTPException(status_code=404, detail="该学生不存在")
# 检查成绩是否已被占用
existing_score=ScoreDAO.get_by_id(db, score.stu_id,score.exam_id)
if existing_score:
raise HTTPException(status_code=400, detail="学生成绩已存在,请勿重复添加")
new_score=ScoreDAO.post_score(db,score)
return new_score
# 修改
@app_score.put("/{stu_id}/{exam_id}",summary='修改信息')
async def update_scores(
stu_id: int,
exam_id: int,
score:ScoreUpdate,
db: Session = Depends(get_db)
):
# 只允许修改成绩,学生id和考试次序不允许修改,SQLAlchemy不能直接更新联合主键本身
# 检查成绩是否已存在
existing_foreign_key = ScoreDAO.inspect_stu_id_unq(db, score.stu_id)
if not existing_foreign_key:
raise HTTPException(status_code=404, detail="该学生不存在")
existing_score=ScoreDAO.get_by_id(db, stu_id,exam_id)
if not existing_score:
raise HTTPException(status_code=404, detail="学生成绩不存在")
# 直接调用DAO更新,只更新score字段
b = ScoreDAO.put_score(db, stu_id, exam_id, score)
return b
# 修改成绩:支持修改 stu_id、exam_id、score;原理:删除旧记录,新增新记录
# stu_id、exam_id是联合主键。MySQL不允许update 直接修改主键字段,SQLAlchemy
# 底层执行会抛数据库异常。所以采用「删旧、建新」的方案模拟修改
# 风险大
# 现在代码:删旧和新增是两次
# db.commit()。
# 如果删旧成功,新增中途崩掉,会出现旧数据没了,新数据没加上,数据丢失。
# 数据库这条记录实际上是新行,不是原来那一行。
# 如果别的表有外键引用这条成绩记录,这个方案会出问题(旧记录删掉,关联跟着没了)。
# @app_score.put("/{stu_id}/{exam_id}",summary='修改学生成绩(支持修改学生ID、考核序次、分数)')
# async def update_scores(
# stu_id: int,
# exam_id: int,
# score:ScoreUpdate,
# db: Session = Depends(get_db)
# ):
# # 1.找到旧记录
# old_score = ScoreDAO.get_by_id(db, stu_id, exam_id)
# if not old_score:
# raise HTTPException(status_code=404, detail="待修改的成绩记录不存在")
# # 2.确定新值:前端没传的字段,沿用旧记录的值
# new_stu = score.stu_id if score.stu_id is not None else old_score.stu_id
# new_exam_id = score.exam_id if score.exam_id is not None else old_score.exam_id
# new_score_val = score.score if score.score is not None else old_score.score
# # 3.校验新stu_id学生是否存在
# if new_stu != old_score.stu_id:
# stu_obj = ScoreDAO.inspect_stu_id_unq(db, new_stu)
# if not stu_obj:
# raise HTTPException(status_code=404, detail="目标学生不存在")
# # 4.如果新主键组合和旧的不一样,要检查新组合是否冲突
# if (new_stu, new_exam_id) != (old_score.stu_id, old_score.exam_id):
# conflict = ScoreDAO.get_by_id(db, new_stu, new_exam_id)
# if conflict:
# raise HTTPException(status_code=400, detail="新【学生ID+考核序次】组合已存在,不能使用")
# # 核心逻辑:删除旧记录,新增一条全新记录
# # 删除旧数据
# ScoreDAO.delete_score(db, stu_id, exam_id)
# # 组装成ScoreCreate对象,调用新增DAO
# from sqlalchemy_fastapi_demo.scheme.Score import ScoreCreate
# new_create_data = ScoreCreate(
# stu_id=new_stu,
# exam_id=new_exam_id,
# score=new_score_val
# )
# new_db_score = ScoreDAO.post_score(db, new_create_data)
# return new_db_score
# 删除
@app_score.delete("/{stu_id}/{exam_id}",summary='删除学生成绩')
async def delete_scores(
stu_id: int,
exam_id: int,
db: Session = Depends(get_db)
):
score=ScoreDAO.delete_score(db, stu_id,exam_id)
if not score:
raise HTTPException(status_code=404, detail="学生成绩不存在")
return {"msg":"删除成功"}