think I'll put: state.session_id = None in a finally block, but you get the idea
On Dec 26, 1:50 pm, Kent <jkentbo...@gmail.com> wrote: > Yes, a nice simplification. > I'm using it to lazyload attributes for objects that aren't in a > session. I'm not sure if you pointed me there, I think I found it > myself, but you helped work out the later details... > Our app lives inside a webserver framework that, very appropriately, > in my opinion, only has one session for any given web request. So, > for our framework, I can safely lazyload related attributes for > transient or detached objects by temporarily setting state.session_id: > > def configure_attribute(class_, attr, inst): > """ > Set up function to be invoked when relations are 'get'ed on > possibly > transient objects, so we can automatically query these related > objects > """ > if isinstance(inst.property, RelationshipProperty): > default_loader = inst.impl.callable_ > def load_value(state, passive): > if state.session_id is not None: > # this is persistent or pending, so > # return default sqla functionality > return default_loader(state, passive) > if passive is attributes.PASSIVE_NO_FETCH: > return attributes.PASSIVE_NO_RESULT > # session_id is currently None > state.session_id = DBSession().hash_key > retval = default_loader(state, passive) > state.session_id = None > return retval > inst.impl.callable_ = load_value > > .. > .. > event.listen(DBEntity, 'attribute_instrument', configure_attribute) > > On Dec 26, 12:26 pm, Michael Bayer <mike...@zzzcomputing.com> wrote: > > > > > > > > > On Dec 26, 2011, at 9:07 AM, Kent wrote: > > > > Documentation for AttributeImpl.callable_ still reads > > > "optional function which generates a callable based on a parent > > > instance, which produces the "default" values for a scalar or > > > collection attribute when it's first accessed, if not present > > > already." > > > But it seems it is no longer the function which generates a callable, but > > > rather is the callable itself now, accepting both the state and the > > > passive parameters. > > > > It used to be two stages, first callable_ accepts a state and then that > > > returns a callable which accepted the passive parameter. > > > yes that was a fabulous simplification of things I'm still very happy about. > > > > Can you briefly summarize how this is meant to work now? (I think the doc > > > string is wrong now??) > > > docstring is wrong yes. the callable just receives a state and a passive > > flag, then loads something for the attribute. It's just one less level > > of "callable" and the two that we have in use are LoadDeferredColumns and > > LoadLazyAttribute in strategies.py. This also isn't very public API and > > if I pointed you to this for some previous issue, I'd be curious if I > > remembered to mention that..... > > > > On 12/25/2011 10:31 AM, Michael Bayer wrote: > > > >> yes a few change names, reconstruct_instance, init_instance, init_failed. > > > >> On Dec 24, 2011, at 7:42 PM, Kent Bower wrote: > > > >>> Right. And reconstruct_instance() was renamed load()? > > > >>> On 12/24/2011 5:56 PM, Michael Bayer wrote: > > >>>> On Dec 24, 2011, at 10:04 AM, Kent wrote: > > > >>>>> As the migration guide suggests, I'd like to embrace the events API. > > >>>>> Is mapper event load() invoked at exactly the same place as the > > >>>>> deprecated reconstruct_instance() ? > > >>>> yeah nothing has been moved. All the places where the internals > > >>>> would call XXXExtension.xxx_event() were just replaced with > > >>>> self.dispatch.xxx_event(), and the old Extension classes are invoked > > >>>> via an adapter to the new system. All unit tests for the extension > > >>>> system remain in place and haven't been modified. > > > >>>>> -- > > >>>>> 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 > > >>>>> athttp://groups.google.com/group/sqlalchemy?hl=en. > > > >>> -- > > >>> 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 > > >>> athttp://groups.google.com/group/sqlalchemy?hl=en. > > > > -- > > > 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 > > > athttp://groups.google.com/group/sqlalchemy?hl=en. -- 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.