如何在此查询中添加if条件?

问题描述 投票:0回答:1

我正在使用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()
python sqlalchemy flask-sqlalchemy
1个回答
1
投票

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()
© www.soinside.com 2019 - 2024. All rights reserved.