我有这个谷歌应用引擎数据存储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
或自定义查询有什么区别?
答案 0 :(得分:1)
我不确定为什么你认为速度差与使用classmethod有关。这两种方法做了完全不同的事情:classmethod正在进行查询(按键和到期),而其他代码正在进行直接获取,很多更快,但之后只返回到期时间比现在少。
查询总是比数据存储区中的查询慢得多,但第二种方法的缺点是总是获取数据 - 因此即使过期日期已过,也会产生成本。
查询的另一个潜在缺点是查询(与获取不同)受最终一致性的影响,因此有可能无法看到最近更新的数据。