what additional behaviors are you looking for that the @property approach isn't 
giving you ?     Options include turning it into a synonym() which would allow 
it to be a little bit more transparent.





On Jan 28, 2013, at 4:55 AM, Pau Tallada wrote:

> Hi,
> 
> Sorry to insist on this :P
> But there is any way to get this kind of behaviour, the "virtual" 
> column/relationship?
> 
> Thanks!
> 
> Pau.
> 
> 2013/1/24 Pau Tallada <[email protected]>
> Hi Michael,
> 
> As always, thank you very much for your dedication :)
> I recognize that I am always trying to reach the edges of your wonderful 
> library.
> 
> That example is just a sample of what I am trying to accomplish:
> Some sort of "virtual" column/relationship, that it is not mapped to any 
> column, but it can be batch-loaded in a set of instances using a 
> carefully-crafted contains_eager.
> That way, using a descriptor, if the attribute is not in __dict__ (as you 
> just pointed), i can craft a CTE to fetch the attribute.
> Or, if the user knows better, will use a with_transformation on top of his 
> query to fetch the attribute for all the queried instances.
> 
> Thank you again!
> 
> 
> 2013/1/23 Michael Bayer <[email protected]>
> 
> 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 <[email protected]>
>> 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 <[email protected]>
>> 
>> 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 [email protected].
>> 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.
>> 
>> 
>> 
>> 
>> -- 
>> ----------------------------------
>> 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 [email protected].
>> 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.
>> <noload.py>
> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to [email protected].
> 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.
> 
> 
> 
> -- 
> ----------------------------------
> 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 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 http://groups.google.com/group/sqlalchemy?hl=en.
> For more options, visit https://groups.google.com/groups/opt_out.
>  
>  

-- 
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 http://groups.google.com/group/sqlalchemy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to