Ah, that makes a lot more sense now.

Your modified createfunc obviously doesn't account for queries with
tuples of entities (some of which may also not be mapped) but I get
the principle. I will just steer well clear of the memory backend -
any production cache would obviously imply pickling and its
sideeffects.

Thanks!

On Aug 25, 4:02 pm, Michael Bayer <mike...@zzzcomputing.com> wrote:
> On Aug 25, 2010, at 10:47 AM, Michael Bayer wrote:
>
>
>
> > On Aug 25, 2010, at 9:37 AM, Nikolaj wrote:
>
> >> Hello,
>
> >> I'm struggling to use the Beaker caching example in my project.
> >> Accessing any attribute on an instance from cache triggers a load from
> >> database of the instance - even trying to read the primary key!
>
> > that means the instances that you're putting in the cache are expired, or 
> > at least those attributes you are attempting to read.    The beaker example 
> > takes the objects from a result and sends them straight to the cache, but 
> > does not detach them from the current session.  Therefore, if your backend 
> > is the "memory" backend, the objects in the cache are the same as those in 
> > your current session and they'll get expired when the session is committed 
> > or rolled back.  
>
> > There's not a really spectacular way to get around that except to not use 
> > the "memory" backend, use one that pickles like memcached (well, pretty 
> > much memcached is the only backend I'd ever use, but the file/dbm file 
> > backends would work here too).
>
> well, this probably would work, this diff is against tip:
>
> diff -r 568ef214c1ac examples/beaker_caching/caching_query.py
> --- a/examples/beaker_caching/caching_query.py  Mon Aug 23 18:17:31 2010 -0400
> +++ b/examples/beaker_caching/caching_query.py  Wed Aug 25 10:55:53 2010 -0400
> @@ -63,8 +63,15 @@
>             if particular attributes have been configured.
>
>          """
> +        
> +        def createfunc():
> +            items = list(Query.__iter__(self))
> +            for item in items:
> +                self.session.expunge(item)
> +            return items
> +            
>          if hasattr(self, '_cache_parameters'):
> -            return self.get_value(createfunc=lambda: 
> list(Query.__iter__(self)))
> +            return self.get_value(createfunc=createfunc)
>          else:
>              return Query.__iter__(self)
>
> I've added a comment in the example regarding this.  
>
>
>
> >> The beaker_caching example runs just fine on my system and doesn't
> >> exhibit the same problems, although that's on SQLite and without
> >> Pylons. I traced through the calls to session._merge and prop.merge
> >> without luck, it seems to run through the column properties and merge
> >> as expected.
>
> >> How do I diagnose this, short of tearing my entire codebase apart? Are
> >> there any instance state attributes I could inspect to see where the
> >> merge is going wrong?
>
> >> N
>
> >> --
> >> You received this message because you are subscribed to the Google Groups 
> >> "sqlalchemy" group.
> >> To post to this group, send email to sqlalch...@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 sqlalch...@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 sqlalch...@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