子查询中的SqlAlchemy闭包

子查询中的SqlAlchemy闭包,sqlalchemy,closures,subquery,correlated-subquery,Sqlalchemy,Closures,Subquery,Correlated Subquery,我搜索了很多主题,但没有找到答案,或者问题太复杂。好吧。这是我的第一个问题。 下面是SQL SELECT parent.*, ( SELECT COUNT(*) FROM child WHERE parent.id = child.parent_id ) FROM parent 如何在sqlalchemy中执行此子句 WHERE ui.invited_by = u.id 可以在收藏中复制吗?sql表达式? 另外,我知道这可以由小组来完成。但我需要子查

我搜索了很多主题,但没有找到答案,或者问题太复杂。好吧。这是我的第一个问题。 下面是SQL

SELECT  parent.*,
(
    SELECT  COUNT(*)
    FROM    child
    WHERE   parent.id = child.parent_id
)
FROM parent
如何在sqlalchemy中执行此子句

WHERE   ui.invited_by = u.id
可以在收藏中复制吗?sql表达式? 另外,我知道这可以由小组来完成。但我需要子查询

谢谢。

SA查询(使用子查询)将为您提供所需的结果:

sq = session.query(Child.parent_id, func.count(Child.id).label("child_num")).group_by(Child.parent_id)
sq = sq.subquery()
# use outerjoin to have also those Parents with 0 (zero) children
q = session.query(Parent, sq.c.child_num).outerjoin(sq)
q = q.filter(Parent.id == 1) # add your filter here: ui.invited_by = u.id
for x in q.all():
    print x
虽然子查询与您描述的不完全相同,但类似于:

SELECT      parent.*,
            anon_1.child_num AS anon_1_child_num 
FROM        parent 
LEFT JOIN  (SELECT  child.parent_id AS parent_id, 
                    count(child.id) AS child_num 
            FROM    child 
            GROUP BY child.parent_id
            ) AS anon_1
        ON parent.id = anon_1.parent_id

我仍然不明白为什么您需要像您描述的那样的子查询。

我在这里找到了非常棒的答案。但也太复杂了。首先,我想告诉大家,sql世界中的闭包是相关的

这不一样,但对我有帮助

pparent = Parent.__table__.alias('pparent') # using table directly to alias.

subquery = s.query(count(Child.id)).join(pparent) # usual thing but use aliased table.

s.query(Parent, subquery.filter(Parent.id == pparent.id).correlate(Parent).as_scalar()) #magic

这是一个好问题。我需要在所有表中进行一些聚合(200万行)。如果我尝试“分组方式”,我的mysql将开始构建临时表。它可以在我开始接收行数小时之前完成。此外,如果您想要批量,您通常无法过滤分组查询。所以我只需要通过聚合得到ID和两个select。如果我通过服务器端游标获取行,它只运行5分钟。