首页 > 解决方案 > 使用行值函数的flask-sqlalchemy查询

问题描述

我有两个表,学生和结果,具有一对一的关系。Student 表最终将包含完整的学生档案信息,Result 表是每个学生的数学和英语测试结果。

class Student(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    student_name = db.Column(db.String(80), nullable=False)
    result_id = db.Column(db.Integer, db.ForeignKey('result.id'), nullable=False)
    result = db.relationship('Result', backref=db.backref('students', lazy=True))


class Result(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    math_score = db.Column(db.Integer)
    english_score = db.Column(db.Integer)

我想选择按两次考试成绩之和排序的前 10 名得分最高的学生。所以类似于:

Student.query.order_by(sum_of(maths_score, english_score)).limit(10).all()

我想将查询结果显示为三列,学生姓名,数学成绩,英语成绩,从最高到最低的总和。我不需要从查询中输出测试分数的总和。我试图避免将测试分数的总和存储在结果表中。

我找不到任何关于如何基于行值函数执行这样的 flask-sqlalchemy 查询的示例。

任何人都可以帮助阐明这一点。

标签: pythonflask-sqlalchemy

解决方案


您可以使用这样的查询:

topten = db.session.query(Student.student_name, (Result.english_score + 
  Result.math_score).label("overall")).join(Result).order_by(desc("overall")).limit(10)

这将创建如下输出: [('Student 2', 12), ('Student 13', 12), ('Student 18', 12), ('Student 19', 10), ('Student 3', 9 ), ('学生 11', 9), ('学生 16', 9), ('学生 20', 9), ('学生 21', 9), ('学生 6', 8)]

如果您创建了 10 岁以上的随机结果学生(范围从 1 到 6)


推荐阅读