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 post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to