SqlAlchemy закрытие в подзапросе - PullRequest
5 голосов
/ 03 сентября 2011

Я искал много тем и не нашел ответа, или вопрос был слишком сложным.Так хорошо.Это мой первый вопрос.Вот SQL

SELECT  parent.*,
(
    SELECT  COUNT(*)
    FROM    child
    WHERE   parent.id = child.parent_id
)
FROM parent

Как сделать это предложение в sqlalchemy?

WHERE   ui.invited_by = u.id

Можно ли воспроизвести его в коллекциях?sql выражения?PS Я знаю, что это может быть сделано group_by.Но мне нужно подзапросом.

Спасибо.

Ответы [ 2 ]

1 голос
/ 08 сентября 2011

Я нахожу здесь действительно потрясающий ответ.Но тоже слишком сложно.Прежде всего я хочу сказать, что замыкание в мире 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
1 голос
/ 07 сентября 2011

Запрос 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

Все еще не понимаю, зачем вам подзапрос, как вы описали.

...