Thanks for your help, Mike!

Douglas

On Thu, 11 Aug 2016 at 17:14 Mike Bayer <mike...@zzzcomputing.com> wrote:

>
>
> On 08/11/2016 03:35 PM, Douglas Russell wrote:
> > Of course! That makes sense.
> >
> > Does SQLAlchemy just discard the subqueryload chain parts that are on
> > the wrong type? It didn't seem to generate any SQL for those when they
> > were wrong.
>
> it validates the path as far as classes / attributes, but I think when
> subclassing and aliasing is used it might be considering just the types,
> e.g. a B2 and a with_polymorphic(B, [B2]) are of compatible types.
> There's a lot of ways these paths get built up (like with string names
> and such), as well as all kinds of "it's worked this way for years"
> kinds of things that may not always be present in testing, so more error
> checking in there would have to be added carefully.
>
>
>
>
> >
> > An example of this in the docs would be a great idea I think as I think
> > it's pretty tough to explain this in the abstract as you say!
> >
> > Thanks again,
> >
> > Douglas
> >
> > On Thursday, 11 August 2016 11:51:39 UTC-4, Mike Bayer wrote:
> >
> >
> >
> >     On 08/11/2016 09:53 AM, Douglas Russell wrote:
> >     > 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
> >
> >
> >     I'm not sure how to document this (I guess just add another example)
> >     but
> >     once you've done of_type(), that's now the type you're on and if you
> >     chain from there, it has to be in terms of that new type.  The
> >     with_polymorphic() object you've made is that type (note the subclass
> >     namespace that's on the object):
> >
> >     b_b2 = with_polymorphic(B, [B2], flat=True)
> >
> >     r = session.query(A2).options(
> >
> subqueryload(A2.bs.of_type(b_b2)).subqueryload(b_b2.B2.cs.of_type(
> >              with_polymorphic(C, [C2], flat=True))
> >          )
> >     ).all()
> >
> >
> >
> >
> >     >
> >     > 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
> >     <https://gist.github.com/dpwrussell/508e8b33fe92434eafe001ee806f355a
> >
> >     >
> >     <https://gist.github.com/dpwrussell/508e8b33fe92434eafe001ee806f355a
> >     <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 sqlalchemy+...@googlegroups.com <javascript:>
> >     > <mailto:sqlalchemy+unsubscr...@googlegroups.com <javascript:>>.
> >     > To post to this group, send email to sqlal...@googlegroups.com
> >     <javascript:>
> >     > <mailto:sqlal...@googlegroups.com <javascript:>>.
> >     > Visit this group at https://groups.google.com/group/sqlalchemy
> >     <https://groups.google.com/group/sqlalchemy>.
> >     > For more options, visit https://groups.google.com/d/optout
> >     <https://groups.google.com/d/optout>.
> >
> > --
> > 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 sqlalchemy+unsubscr...@googlegroups.com
> > <mailto:sqlalchemy+unsubscr...@googlegroups.com>.
> > To post to this group, send email to sqlalchemy@googlegroups.com
> > <mailto:sqlalchemy@googlegroups.com>.
> > Visit this group at https://groups.google.com/group/sqlalchemy.
> > For more options, visit https://groups.google.com/d/optout.
>
> --
> You received this message because you are subscribed to a topic in the
> Google Groups "sqlalchemy" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/sqlalchemy/mu56muQI6tM/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at https://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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 sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to