Я новичок в sqlalchemy, и, хотя документация кажется достаточно тщательной, я не мог найти способ сделать то, что мне нужно.
Скажем, у меня две таблицы: форум и сообщение. Каждый форум имеет родительский форум и любое количество сообщений. Я хочу:
- Список форумов верхнего уровня
- Довольно загруженные дочерние форумы, доступные через форумы верхнего уровня.
- Количество сообщений для каждого дочернего форума
Итак, я начал с:
query(Forum).filter(Forum.parent==None).all()
Который дает мне все форумы верхнего уровня. Конечно, доступ к дочерним форумам дает n запросов на выбор.
query(Forum).options(eagerload('children')).filter(Forum.parent==None).all()
Это решает проблему n выбора.
Теперь мое лучшее предположение выглядит примерно так:
query(Forum, func.count(Forum.children.posts)).options(eagerload('children')).filter(Forum.parent==None).group_by(Forum.children.id).all()
Но все, что я получаю, это:
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute 'posts'
Я пробовал несколько вариантов, но не получил. Для ясности я ищу эквивалент этого SQL:
select Forum.*, Child.*, count(Post.id)
from Forum
left join Forum Child on Child.parent = Forum.id
left join Message on Message.forum = Child.id
where Forum.parent is null
group by Child.id