上传文件至「dao」 #6
+123
@@ -0,0 +1,123 @@
|
||||
from sqlalchemy import func, desc
|
||||
from sqlalchemy.exc import SQLAlchemyError
|
||||
from model.Employment import Employment
|
||||
from fastapi import HTTPException
|
||||
from model.Students import Student
|
||||
from model.Score import Scores
|
||||
|
||||
# ① 超30岁学员
|
||||
def fun1(db):
|
||||
try:
|
||||
rows = db.query(Student).filter(Student.age>30).all()
|
||||
return [{'id': i.stu_id, 'name': i.name} for i in rows]
|
||||
except SQLAlchemyError as e:
|
||||
db.rollback()
|
||||
raise HTTPException(status_code=400,detail=f'查询超三十岁学员信息失败:{str(e)}')
|
||||
|
||||
# ② 各班人数 + 男女比
|
||||
def fun2(db):
|
||||
try:
|
||||
rows = db.query(
|
||||
Student.stu_class,
|
||||
Student.gender,
|
||||
func.count(1).label('num')
|
||||
).group_by(Student.stu_class, Student.gender).all()
|
||||
return [{'班级': r.stu_class, '性别': r.gender, '人数':r.num } for r in rows]
|
||||
except Exception as e:
|
||||
db.rollback()
|
||||
raise HTTPException(status_code=400,detail=f'查询各班人数与男女比例失败:{str(e)}')
|
||||
|
||||
# ③ 每次考试都≥80分的学生
|
||||
def fun3(db):
|
||||
try:
|
||||
print('1111111111-----')
|
||||
rows = db.query(
|
||||
Scores.stu_id,
|
||||
Student.name,
|
||||
func.min(Scores.score).label('min_score')
|
||||
).join(Student, Student.stu_id == Scores.stu_id) \
|
||||
.group_by(Scores.stu_id, Student.name) \
|
||||
.having(func.min(Scores.score) >= 80).all()
|
||||
t = ['stu_id', 'name', 'min_score']
|
||||
l = [dict(zip(t, row)) for row in rows]
|
||||
return l
|
||||
except Exception as e:
|
||||
db.rollback()
|
||||
raise HTTPException(status_code=400,detail=f'查询成绩大于80的学生失败:{str(e)}')
|
||||
|
||||
# ④ 两次以上不及格的学生
|
||||
def fun4(db):
|
||||
try:
|
||||
rows = db.query(
|
||||
Student.name,
|
||||
Student.stu_class,
|
||||
).join(Scores, Scores.stu_id == Student.stu_id) \
|
||||
.filter(Scores.score < 60) \
|
||||
.group_by(Scores.stu_id,Student.name,Student.stu_class) \
|
||||
.having(func.count(Scores.id) >= 2).all()
|
||||
t = ['name', 'stu_class']
|
||||
l = [dict(zip(t, row)) for row in rows]
|
||||
return l
|
||||
except Exception as e:
|
||||
db.rollback()
|
||||
raise HTTPException(status_code=400,detail=f'查询两次不及格的学生失败:{str(e)}')
|
||||
|
||||
# ⑤ 每次考试各班平均分(降序)
|
||||
def fun5(db):
|
||||
try:
|
||||
print('5555555555')
|
||||
rows = db.query(
|
||||
Scores.exam_seq,
|
||||
Student.stu_class,
|
||||
func.avg(Scores.score).label('avg_score')
|
||||
).join(Student, Student.stu_id == Scores.stu_id) \
|
||||
.group_by(Scores.exam_seq, Student.stu_class) \
|
||||
.order_by(desc('avg_score')).all()
|
||||
t = ['exam_seq', 'stu_class','avg_score']
|
||||
l = [dict(zip(t, row)) for row in rows]
|
||||
return l
|
||||
except Exception as e:
|
||||
db.rollback()
|
||||
raise HTTPException(status_code=400, detail=f'查询各班平均分失败:{str(e)}')
|
||||
|
||||
# ⑥ 薪资前五名
|
||||
def fun6(db):
|
||||
try:
|
||||
rows = db.query(Student.name, Student.stu_class,Employment.work_date,Employment.company,Employment.salary).join(Student, Student.stu_id == Employment.s_id).order_by(Employment.salary).limit(5).all()
|
||||
t = ['s_name','stu_class','work_date','company','salary']
|
||||
l = [dict(zip(t, row)) for row in rows]
|
||||
print(l)
|
||||
return {'code': 200, 'data': l}
|
||||
except Exception as e:
|
||||
db.rollback()
|
||||
raise HTTPException(status_code=400,detail=f'查询薪资前五名失败失败:{str(e)}')
|
||||
|
||||
# ⑦ 每个学生就业时长
|
||||
def fun7(db):
|
||||
try:
|
||||
rows = db.query(Employment.s_id,func.datediff(Employment.offer_date,Employment.open_date).label('offer_s')).group_by(Employment.s_id,Employment.offer_date,Employment.open_date).all()
|
||||
t = ['s_id', 'offer_s']
|
||||
l = [dict(zip(t, row)) for row in rows]
|
||||
return {'code': 200, 'data': l}
|
||||
except Exception as e:
|
||||
db.rollback()
|
||||
raise HTTPException(status_code=400,detail=f'查询每个学生的就业时长失败:{str(e)}')
|
||||
|
||||
# ⑧ 各班平均就业时长
|
||||
def fun8(db):
|
||||
try:
|
||||
rows = db.query(
|
||||
Student.stu_class,
|
||||
func.avg(func.datediff(Employment.offer_date, Employment.open_date)).label('avg_duration')
|
||||
).join(Student, Student.stu_id == Employment.s_id).filter(
|
||||
Employment.open_date.isnot(None)
|
||||
).group_by(Student.stu_class).all()
|
||||
t = ['stu_class', 'avg_duration']
|
||||
l = [dict(zip(t, row)) for row in rows]
|
||||
return l
|
||||
except Exception as e:
|
||||
db.rollback()
|
||||
raise HTTPException(status_code=400,detail=f'查询各班平均就业时长失败:{str(e)}')
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user