将查询输出作为输入传递给SQLAlchemy中另一个查询的in子句

时间:2019-08-27 06:55:40

标签: python sqlalchemy flask-sqlalchemy

我有2个表(例如StudentCollege)和第三个表(StudentCollege),其中有student_idcollege_id外键。 / p>

我想从下面的查询中给出输出:

list = (
    db.session.query(StudentCollegeModel.College_id)
    .filter(StudentCollegeModel.student_id== student_id)
    .all()
)

到以下查询:

(
    db.session.query(CollegeModel)
    .filter(CollegeModel.College_id.in_(list))
    .all()
)

但是它给了编程错误。

3 个答案:

答案 0 :(得分:3)

您无需执行第一个查询即可将其用作第二个查询的子查询。这使您不必在进行College_id查询之前就构造所有in_()的内存列表,这意味着您只需要往返数据库一次即可。

subquery = (
    db.session.query(StudentCollegeModel.College_id)
    .filter(StudentCollegeModel.student_id== student_id)
)

result = (
    db.session.query(CollegeModel)
    .filter(CollegeModel.College_id.in_(subquery))
    .all()
)

答案 1 :(得分:0)

您的第一个查询返回一个命名元组列表。您需要将其转换为列表。例如:

college_tuples = db.session.query(StudentCollegeModel.College_id).filter(StudentCollegeModel.student_id == student_id).all()
college_id_list = [r.College_id for r in college_tuples]
db.session.query(CollegeModel.filter(CollegeModel.College_id.in_(college_id_list)).all()

在这里,我们获取您的大学ID元组,将其展平,然后使用展平的版本执行第二个查询。

答案 2 :(得分:0)

类似如下:

cs = StudentCollegeModel.query.filter_by(student_id=student_id).distinct('college_id').entities_with('college_id', flat=True).all()
CollegeModel.query.filter(CollegeModel.College_id.in_(cs)).all()