I'm looking to do the same (automatic invalidation). Vince, were you able to get it to work? Any tips worth sharing?
thanks, --S On Monday, December 13, 2010 5:31:17 PM UTC-8, Vince Ng wrote: > > Hi, > > > I've been attempting to try to add an abstract layer of Memcache on top of > the current version of SQLAlchemy, but I've been running into a few > different issues and wanted to get a few thoughts on the best approach on > loading objects. > > > I've studied the examples at: > > http://www.sqlalchemy.org/trac/browser/examples/beaker_caching > > My issue with these methods are they cache simple queries and > relationships, but in a fairly simple way and doesn't account for > invalidation. They also seem to require more explicit query calls versus > some of the sophisticated lazy-loading property relationship mapping of > SQLAlchemy. > > > My goal is to add Memcache at the object layer based on primary key (and > to control caching of specific object types, versus caching all queries > generated). All ColumnProperty's of an object may be stored in cache, and > relationships and RelationshipProperty's are ignored for now. The objects > that the relationships point to may be stored in cache on their primary > key. If an object is updated/deleted, then the object in cache will be > invalidated. > > > Basic Example of What I'd Like to Accomplish: > > # User has property 'image' which has a 'image_id' foreign key relation to > Image object > > > # initial request > > user = Session.query(User).get(1) > > # checks memcache for user ID 1 > > # nothing in memcache, queries DB for user ID 1 (image_id for user 1 is > 100) > > # stores user 1 data in memcache > > image = user.image > > # checks memcache for image ID 1 > > # nothing in memcache, queries DB for image ID 100 > > # stores image 100 data in memcache > > > # separate subsequent request > > user = Session.query(User).get(1) > > # checks memcache for user ID 1, found it! > > # populate User object with data from memcache > > image = user.image > > # checks memcache for image ID 100, found it! > > # populate Image object with data from memcache > > image.view_count = image.view_count + 1 > > Session.commit() > > # invalidate image ID 100 in memcache > > > I suspect the best way to issue invalidate requests to Memcache will be to > create a MapperExtension and use before_update() and before_delete(). > > > However, I'm having much more trouble figuring out where and how I should > store data in Memcache and when/how to load from it. MapperExtensions only > offer hooks after data has been read from the DB. I've looked into > subclassing the Query class and overriding the get() function (as well as a > few other functions), but the problem I run into is that I can load the > regular columns properties, but will run into issues with lazy-loaded > RelationshipProperties with mostly the error: > > "DetachedInstanceError: Parent instance <User at 0x7fc7503942d0> is not > bound to a Session; lazy load operation of attribute 'images' cannot > proceed" > > > Any ideas or suggestions? > > > Thanks, > > Vince > -- 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 sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy?hl=en. For more options, visit https://groups.google.com/groups/opt_out.