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.