SQLAlchemy子查询比较

时间:2016-07-10 12:11:43

标签: python sqlalchemy

我有以下一组表格:

class Job(db.Model):
    __tablename__ = 'jobs'
    id = db.Column(db.Integer, primary_key=True)


class Informant(db.Model):
    __tablename__ = 'informants'
    id = db.Column(db.Integer, primary_key=True)
    job_id = db.Column(db.Integer, db.ForeignKey('jobs.id'))
    max_students = db.Column(db.Integer)        


class Student(db.Model):
    __tablename__ = 'students'
    id = db.Column(db.Integer, primary_key=True)


queues = db.Table('queues',
                  db.Column('student_id', db.Integer, db.ForeignKey('students.id')),
                  db.Column('job_id', db.Integer, db.ForeignKey('jobs.id')),
                  PrimaryKeyConstraint('student_id', 'job_id'))

现在我需要获得类似的东西:

SELECT jobs.id
FROM jobs
WHERE (
    SELECT SUM(informants.max_students)
    FROM informants
    WHERE informants.job_id = jobs.id
) <= (
    SELECT COUNT(1)
    FROM queues
    WHERE queues.job_id = jobs.id
)

所以基本上我用一定数量的学生搜索工作,这些学生超过了最大容量,即相关信息提供者能力的总和。有没有一种干净的方法在SQLAlchemy中执行此操作?我尝试了以下方法:

db.session.query(Job.id).filter( \
    db.session.query(db.func.sum(Informant.max_students)). \
        filter(Informant.job_id == Job.id) <= \
    db.session.query(db.func.count(1)).select_from(queues). \
        filter(queues.c.job_id == Job.id))

这会产生类似SELECT jobs.id FROM jobs WHERE 0 = 1的内容。有没有我缺少的东西,因为我之前已成功使用过类似的查询。或者我最好使用db.engine.execute来执行原始SQL?

1 个答案:

答案 0 :(得分:0)

我接近得到了正确的答案。缺少的部分是两个子查询上的as_scalar方法。所以最后的查询是:

db.session.query(Job.id).filter( \
    db.session.query(db.func.sum(Informant.max_students)). \
        filter(Informant.job_id == Job.id).as_scalar() <= \
    db.session.query(db.func.count(1)).select_from(queues). \
        filter(queues.c.job_id == Job.id).as_scalar())