I'm new to sqlalchemy, and while the documentation seems fairly thorough, I couldn't find a way to do quite what I want.
Say I have two tables: forum and post. Each forum has a parent forum, and any number of posts. What I want is:
- A list of top-level forums
- Eagerly loaded child forums accessible through the top-level forums
- A count of posts for each child forum
So I started with:
query(Forum).filter(Forum.parent==None).all()
Which gives me all the top level forums. Of course accessing the child forums yields n select queries.
query(Forum).options(eagerload('children')).filter(Forum.parent==None).all()
This solves the n select problem.
Now my best guess goes something like this:
query(Forum, func.count(Forum.children.posts)).options(eagerload('children')).filter(Forum.parent==None).group_by(Forum.children.id).all()
But all I get is:
AttributeError: Neither 'InstrumentedAttribute' object nor 'Comparator' object has an attribute 'posts'
I've tried a few variations, but haven't got any further. Just for clarity I'm looking for the equivalent of this 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