如何或何时正确使用GAE @classmethod

时间:2014-08-04 12:20:45

标签: python google-app-engine google-cloud-datastore app-engine-ndb

我有这个谷歌应用引擎数据存储NDB模型:

class pySessions(ndb.Model):
    # sid is the key/id
    data = ndb.Blobproperty(required=True)
    expiry = ndb.DateTimeProperty(required=True) 

    @classmethod                                                                                                                                                              
    def get_sid(cls, sid):                                                                                                                                                    
        sid_key = ndb.Key(cls, sid)                                                                                                                                           
        return cls.query(cls.key == sid_key,                                                                                                                                        
                         cls.expiry >= datetime.utcnow()).get()                                                                                                                        

要获得特定的 sid ,我可以使用以下内容:

data = pySessions.get_by_id(sid)
if session and session.expiry >= datetime.utcnow():
    return session.data
return {}

或者我可以使用@classmethod get_sid

data = pySessions.get_sid(sid)

两者都有效,但在进行一些测试时,请注意@classmethod行为较慢,或者没有读取更新的会话数据。

我正在使用基本计数器进行测试但是在递增之后,我正在重新加载(标题位置)页面,在这里我注意到由于某些未知的原因使用@classmethod get_sid查询NBB存在一些问题,我使用pdb调试器的唯一方法就是使用pdb调试器,因为它正在进行“暂停”并允许代码慢慢读取数据。

了解使用@classmethod或自定义查询有什么区别?

1 个答案:

答案 0 :(得分:1)

我不确定为什么你认为速度差与使用classmethod有关。这两种方法做了完全不同的事情:classmethod正在进行查询(按键和到期),而其他代码正在进行直接获取,很多更快,但之后只返回到期时间比现在少。

查询总是比数据存储区中的查询慢得多,但第二种方法的缺点是总是获取数据 - 因此即使过期日期已过,也会产生成本。

查询的另一个潜在缺点是查询(与获取不同)受最终一致性的影响,因此有可能无法看到最近更新的数据。