在子查询中获取集合

时间:2016-08-17 10:28:05

标签: python sqlalchemy flask-sqlalchemy

假设我们有两个表,通过多对多关系链接。

class Student(db.Model):
    id = db.Column(UUIDType, primary_key=True)
    name = db.Column(db.String(255))
    courses = db.relationship('Course',
                              secondary=student_courses,
                              backref=db.backref('students'))


class Course(db.Model):    
    id = db.Column(UUIDType, primary_key=True)
    name = db.Column(db.String(255))

我正在尝试使用子查询查询他/她订阅的课程名称的学生姓名,但它只显示第一个匹配课程的名称(不是全部)。换句话说,我想检索(student_id, student_name, [list of course_names])

sq = db.session.query(Student.id.label('student_id'),
                      Course.id.label('course_id'),
                      Course.name.label('course_name')) \
               .join(Student.courses) \
               .group_by(Student.id, Course.id).subquery('pattern_links_sq')

db.session.query(Student.id, Student.name, sq.c.course_name) \
          .join(Student.courses)
          .filter(Student.id == sq.c.student_id).all()

1 个答案:

答案 0 :(得分:0)

您可以在PostgreSQL中使用array_agg功能

from sqlalchemy import func

db.session.query(Student.id, Student.name, func.array_agg(Course.name))\
          .join(Student.courses)\
          .group_by(Student.id)\
          .all()