我正在使用flask_sqlalchemy。
我有2个班级的10名学生,收费。
当school_class_id
通过时,我只需要从特定班级返回所有学生的学生。
第一个查询适用于列出所有学生。在第二个代码中,添加了school_class_id
,列出了预期用于列出特定班级的学生。
但是当我在school_class_id
条件下添加一个if
过滤器时,它只返回一个学生。
此代码适用于获取所有学生:
result = db.session.query(
Student, SchoolClass, Guardian,
func.sum(StudentFee.net_payable).label('total_payable'),
).filter(
and_(SchoolClass.school_id == user['school_id'],
SchoolClass.id == Student.school_class_id),
SchoolClass.status == GenEnum.ACTIVE.value).join(
StudentGuardian, StudentGuardian.student_id == Student.id).filter(
Guardian.id == StudentGuardian.guardian_id
).outerjoin(StudentFee,
StudentFee.student_id == Student.id
).filter(StudentFee.status == NewEnum.ACTIVE.value).group_by(Student.id)
result.all()
传递school_class_id
时此代码有效:
result = db.session.query(
Student, SchoolClass, Guardian,
func.sum(StudentFee.net_payable).label('total_payable'),
).filter(
and_(SchoolClass.school_id == user['school_id'],
# SchoolClass.id == body.get('school_class_id'),
SchoolClass.id == Student.school_class_id),
SchoolClass.status == GenEnum.ACTIVE.value).join(
StudentGuardian, StudentGuardian.student_id == Student.id).filter(
Guardian.id == StudentGuardian.guardian_id
).outerjoin(StudentFee,
StudentFee.student_id == Student.id
).filter(StudentFee.status == NewEnum.ACTIVE.value).group_by(Student.id)
result.all()
但是此代码添加过滤器后来有一些问题,因为它只返回一个学生:
result = db.session.query(
Student, SchoolClass, Guardian,
func.sum(StudentFee.net_payable).label('total_payable'),
)
if body.get('school_class_id'):
result.filter(SchoolClass.id == body.get('school_class_id'))
result.filter(
and_(SchoolClass.school_id == user['school_id'],
SchoolClass.id == Student.school_class_id),
SchoolClass.status == GenEnum.ACTIVE.value).join(
StudentGuardian, StudentGuardian.student_id == Student.id).filter(
Guardian.id == StudentGuardian.guardian_id
).outerjoin(StudentFee,
StudentFee.student_id == Student.id
).filter(StudentFee.status == NewEnum.ACTIVE.value).group_by(Student.id)
result.all()
SQLAlchemy Query
对象是生成的。换句话说,诸如Query.filter()
之类的方法会产生一个新对象,而不是改变现有对象。在您尝试添加条件过滤时,您会生成并丢弃2个新查询。因此,您只获得1行的原因是您最终运行的实际查询具有没有显式GROUP BY
子句的聚合,因此整个集合被视为单个组。修复很简单,只需在添加过滤器时重新分配查询等:
result = db.session.query(...)
if body.get('school_class_id'):
result = result.filter(...)
result = result.filter(...).join(...).outerjoin(...).filter(...).group_by(...)
result.all()