On Jan 23, 2013, at 4:28 PM, Pau Tallada wrote:

> Hi,
> 
> I have prepared a sample of code to ilustrate this behaviour :)
> 
> Summarizing:
> 
> session.expunge_all()
> n2 = 
> session.query(Node).filter_by(name='n2').options(joinedload('ancestors')).one()
> print n2.ancestors
> 
> AND:
> 
> session.expunge_all()
> n2 = session.query(Node).filter_by(name='n2').one()
> n2 = 
> session.query(Node).filter_by(name='n2').options(joinedload('ancestors')).one()
> print n2.ancestors
> 
> do NOT produce the same result when the collection is lazy='noload'.
> 
> In the latter, the collection is empty, even after we fetch its contents with 
> a joinedload.

Ah well without actually running it, I can say that the joinedload for the 
second case won't have an effect like that, since "n2.ancestors" is already 
"loaded", as the effect of "noload" is to populate the attribute with an empty 
collection (or None for a scalar).   "noload" is not very widely used and was 
sort of an added-in strategy from very early versions.

What it appears like you're looking for on "anscestors" is just the default 
"lazy" loader.  Above, when you load "n2" without any options, n2.anscestors 
will not be present in n2.__dict__ at all, and that's what "unloaded" means.   
Hitting it again with the joinedload() should populate the collection.

But there's not really a built in system of, "don't load this mapped attribute, 
but also don't load anything when touched".   So if you stuck with "noload", 
you'd have to call expire() on "ancestors" first in order to get a subsequent 
loader to populate it.    

I guess if I really wanted an attribute like this, I'd need to wrap it under a 
@property:

@property
def ancestors(self):
    if "_ancestors" in self.__dict__:
        return self._anscestors
   else:
        return None

if I think of a better way I'll let you know.





> 
> 
> 2013/1/23 Pau Tallada <tall...@pic.es>
> Ok, thank you very much :D
> 
> I'll keep poking, and i'll try to provide a sample code :P
> 
> 
> 2013/1/23 Michael Bayer <mike...@zzzcomputing.com>
> 
> On Jan 23, 2013, at 6:49 AM, Pau Tallada wrote:
> 
> >
> > One final comment. With the contains_eager query, the instances that are 
> > part of the collection are retrieved from the database but not stored on 
> > the identity_map. Is that also the expected behaviour, isn't it?
> 
> I need to read your whole email more closely but on this point, that's not 
> true at all.  Every object that the Session loads from the database goes 
> directly to the identity map.    The identity map is weak referencing, so if 
> no other references remain to a particular object, it will disappear from the 
> identity map also, but that implies that object is not accessible anywhere 
> else either.
> 
> Since it seems like you've been poking around, you might want to continue 
> poking around some more given that information until I have time to look at 
> the rest of your email.
> 
> 
> --
> 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 
> sqlalchemy+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
> 
> 
> 
> 
> -- 
> ----------------------------------
> Pau Tallada Crespí
> Dep. d'Astrofísica i Cosmologia
> Port d'Informació Científica (PIC)
> Tel: +34 93 586 8233
> ----------------------------------
> 
> 
> 
> 
> -- 
> ----------------------------------
> Pau Tallada Crespí
> Dep. d'Astrofísica i Cosmologia
> Port d'Informació Científica (PIC)
> Tel: +34 93 586 8233
> ----------------------------------
> 
> 
> -- 
> 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 
> sqlalchemy+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
> <noload.py>

-- 
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 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to