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.


Reply via email to