asynctools的缓存bug
2010 10 31 03:36 PM 1405次查看
分类:Google App Engine 标签:Google App Engine, Python
self._cache_key = "%s,query=%s,limit=%s,offset=%s" % (self.__class__.__name__, str(self._query),str(limit),str(offset))
这个self._query是一个db.Query或db.GqlQuery对象,它没有实现__str__方法,因此str(self._query)拿到的是它的内存地址,而这在每次查询时都是会变化的,因此起不到缓存的效果。另外他也没有处理cursor,这会让后续的查询出错。
研究了一下后发现,可以将db.Query对象转换成datastore.Query对象,然后再转换成pb对象。考虑到pb对象很大,还可以只取其hash值。实现如下:
self._cache_key = "DatastoreQueryTask:%s" % hash(query._get_query()._ToPb(limit, offset, limit))
不过由于用到了私有方法,显得不是那么安全。
向下滚动可载入更多评论,或者点这里禁止自动加载。