On Sat, 12 Jul 2008 16:02:15 -0400 Rick Morrison <[EMAIL PROTECTED]> wrote:
> Suppose you have a list result of a simple query: > > vector = S.query(MappedObj).filter(foo).all() > > and assume "MappedObj" has a simple relation "children", each of those in > turn having a simple relation "grandchildren". It would be nice to say > something like > > S.vectorload(vector, 'children.grandchildren') > > and have *all* the children + grandchildren loaded for each item in > 'vector'. This would definately work for what I'm trying to do, although I don't specifically need support for a sequence of instances. Supporting sequences does seem more general, were not for it being harder to implement. <handwaving> One would think the DBMS could simply implement lengthy IN clauses by making a single-column temporary table out of the set of values and then joining against it. Seems silly that it needs quadratic-time for IN and much less for a join, when they're logically the same thing. </handwaving> On Sat, 12 Jul 2008 22:50:19 -0400 Michael Bayer <[EMAIL PROTECTED]> wrote: > You can do it when the Query first happens, but have the eagerload > operation delayed until the lazyload. the "eagerload()" query > option will plant itself inside the lazy loader and take effect when > the lazy load occurs, if that's how its set up. > > assume A->bs->B->cs->C > > a = sess.query(A).options(eagerload('cs')).first() > print a.bs[0].cs # will lazyload "b" eagerloading "cs" > > This same idea takes effect if you just say "lazy=False" when you > declare the "cs" relation on "B". Right, I'm aware of this API and would be using it except for that, where the query happens I don't actually know if I want it or not. I should point out that what is making this such a difficult problem is the fact that this function that does the querying doesn't a priori know what class it's going to be querying for, I pass that in as a parameter. Thus, hardcoding eagerload options into the function would involve some reflection and special case complexity that I would prefer to avoid. > To setup the eagerness of "cs" at the exact point of lazy load, the > public API that allows this is via "lazy='dynamic'", which would > allow: > > a = sess.query(A).first() > print a.bs.option(eagerload('cs')).first() > > But that changes the "lazyness" of "bs" considerably. This seems like it might be pointing to a solution, but, what do you mean by the last statement? > Yet another option would be an API that allows the "eagerload('cs')" > option to be embedded into the lazy loader present on "A.bs". This > is possible right now but you'd be calling upon non-public APIs to do > it. I don't think I need this if I'm able to set up the eagerload of "cs" having only an instance of "A", since the very next thing that happens is I access "A.bs" and trigger it's loader anyway. -Kyle --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---