Google应用引擎:将模型名称作为参数传递给函数

时间:2013-03-01 12:57:17

标签: google-app-engine memcached

为了减少数据存储区的读写,人们建议使用memcache:

写:

entity.put()
memcache.set(entity.key.id(), entity)

读:

# id known:
entity = memcache.get(id)
if entity is None:
    entity = Model.get_by_id(id)
    memcache.set(id, entity)

我想将上述功能实现为两个功能:

def memPut(entity):
    entity.put()
    memcache.set(entity.key.id(), entity)

def memGet(Model, id):
    entity = memcache.get(id)
    if entity is None:
        entity = Model.get_by_id(id)
        memcache.set(id, entity)

memGet只是假设。我的问题:1)如何将Model的名称作为参数传递给函数? 2)如果在没有指定id的情况下创建实体,GAE将使用整数作为其id。如果有两个具有相同ID的实体(当然来自不同型号)怎么办? memcache.get(id)会工作吗?

2 个答案:

答案 0 :(得分:2)

如果你想为所有实体类型提供相同的函数,一个简单的选择就是从父模型中继承所有模型,它实现了以下类方法:

class ParentClass(db.Model):
    @classmethod
    def memPut(cls, entity):
        entity.put()
        memcache.set(entity.key().id(), entity)

    @classmethod
    def memGet(cls, id):
        entity = memcache.get(id)
        if entity is None:
             entity = cls.get_by_id(id)
             memcache.set(id, entity)
        return entity

然后,在你的处理程序中:

 MyModel.memPut(entity)
 entity = MyModel.memGet(id)

答案 1 :(得分:2)

为什么不使用ndb.Model而不是db.Model?

https://developers.google.com/appengine/docs/python/ndb/

NDB API在无模式对象数据存储区中提供持久存储。它支持自动缓存,复杂查询和原子事务。 NDB非常适合存储结构化数据记录。它提供了App Engine数据存储区API的替代方案。 NDB具有数据存储API缺少的一些功能:

StructuredProperty类,它允许实体具有嵌套结构 集成的自动缓存,通常通过上下文缓存和Memcache提供快速(和廉价)读取 允许并发操作的异步API(如果不需要,则为“同步”API)