Hello,

Several people already wrote something about memcached + SqlAlchemy.

Remember, Mike Nelson wrote a mapper extention, it is available at:
http://www.ajaxlive.com/repo/mcmapper.py
http://www.ajaxlive.com/repo/mcache.py

I've rewritten it a bit to fit 0.4 release of SA.

Any response and comments are welcome, since I am not sure I am doing
right things in the code :) I dont like that dirty tricks with
deleting _state, etc. Maybe it could be done better?

But it works somehow. It manages to cache query get operations.

It has some problems with deferred fetch on inherited mapper because
of some issues of SA (I've found them in Trac).

import memcache as mc

class MCachedMapper(MapperExtension):
    def get(self, query, ident, *args, **kwargs):
        key = query.mapper.identity_key_from_primary_key(ident)
        obj = query.session.identity_map.get(key)
        if not obj:
            mkey = gen_cache_key(key)
            log.debug("Checking cache for %s", mkey)
            obj = mc.get(mkey)
            if obj is not None:
                obj.__dict__["_state"] = InstanceState(obj)
                obj.__dict__["_entity_name"] = None
                log.debug("Found in cache for %s : %s", mkey, obj)
                query.session.update(obj)
            else:
                obj = query._get(key, ident, **kwargs)
                if obj is None:
                    return None
                _state = obj._state
                del obj.__dict__["_state"]
                del obj.__dict__["_entity_name"]
                mc.set(mkey, obj)
                obj.__dict__["_state"] = _state
                obj.__dict__["_entity_name"] = None
        return obj

    def before_update(self, mapper, connection, instance):
        mkey =
gen_cache_key(mapper.identity_key_from_instance(instance))
        log.debug("Clearing cache for %s because of update", mkey)
        mc.delete(mkey)
        return EXT_PASS

    def before_delete(self, mapper, connection, instance):
        mkey =
gen_cache_key(mapper.identity_key_from_instance(instance))
        log.debug("Clearing cache for %s because of delete", mkey)
        mc.delete(mkey)
        return EXT_PASS

The mapper can be used like this:

mapper(User, users_table, extension=MCachedMapper())
session = create_session()
user_1234 = session.query(User).get(1234) # this one loads from the DB
session.clear()
user_1234 = session.query(User).get(1234) # this one fetches from
Memcached

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
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