of_type was what I was searching for. Thanks. Unfortunately, it did not yield the desired results when I extended the hierarchy to 3 levels (C->C2 with a relation between B and C).
I've updated the Gist. B+B2 is successfully queried, but C+C2 is not. This will then result in lazily generated queries when accessing C2. In fact, it's actually a little more confusing even than that. With that query, it does (in the original query) Query for all A+A2 Query for all B+B2 (from the subqueryload) Then once I start to print the hierarchy out, lazy queries: Query for all C Query for each C2 Cheers, Douglas On Wednesday, 10 August 2016 18:18:27 UTC-4, Douglas Russell wrote: > > Hi, > > I have two (well, more than two with more than two levels each, but this > is the simplest recreation of the problem) parallel joined-table > inheritance hierarchies > > A -> A2 > B -> B2 > > B.a is a relationship to A, backref in A.bs. > > The problem arises when I want to query this whole structure back with > subqueries. The desired number of queries in this case would be twoish, > depending on how the polymorphic queries are done. At any rate, the desire > is to remove any lazy loading at all. > > The problem lies in formulating a subqueryload which will do this. My > first thought was: > > session.query(A2).options(subqueryload(A2.bs)).all() > > The problem with this is that what I wanted was all the A2s and all the > B2s, but what I get is all the A2s, and all the Bs. When I access a > property of B2, it lazy loads that single record. > > I think the best solution is something along the lines of using a > combination of subqueryload and joinedload (or maybe with_polymorphic?) to > say: Give me all the A2s with a subquery for all the B2s linked to it. I > can't figure out how to do this as the arguments to subqueryload and > joinedload are relationships which I don't currently have. > > Minimal Test Case: > https://gist.github.com/dpwrussell/508e8b33fe92434eafe001ee806f355a > > Is there a clever way to handle this? > > The only thing I've done which works is to add a relationship between B to > B2: > > b = relationship('B', backref='b2') > > Then I can do: > > r = session.query(A2).options(subqueryload(A2.bs).joinedload(B.b2)).all() > > but it would be better if I didn't have to go and add these relationships > to the existing models as there are several levels, repositories and (most > hinderingly) jurisdictions in play in my real project. It seems likely that > there is a clever way as SQLAlchemy does such a good job with the > polymorphic queries usually. > > Cheers, > > Douglas > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.
