Model实例与dict和JSON相互转换的方法

标签:Google App Engine, Python

今天在读GAE SDK源码时发现,Entity实际上就是dict的子类,而Model也有个转换成Entity对象的_to_entity方法,于是可以轻易转换成dict对象,再用simplejson转换成JSON即可。

转换回去就更简单了,因为Model的构造函数是可以传字典参数的,而且还有个from_entity类方法。

原来可以通过key直接删除实体了

标签:Google App Engine, Python

记得最初删除实体时,还需要先fetch或get实体,再调用实体的delete方法或db.delete()来删除,这就导致了删除时效率特别低。

今天突发奇想,觉得db.delete()应该可以接受key做参数,于是看了下源码,发现果然是可行的,而且传实体给它也会被自动转换成key,那么直接传key自然效率更高。

用deferred时遇到个PicklingError

标签:Google App Engine, Python

用deferred写了个任务,本以为没错的代码,测试时却遇到这个错误:
<class 'pickle.PicklingError'>: Can't pickle <function generate_categories at 0x6a4387e469f6a3b8>: it's not found as model.generate_categories
研究了半天才明白过来,model.generate_categories这个玩意我当然没有定义,我是在model模块里调用Category.generate_categories()这个静态函数。看来pickle这个玩意比较傻,只能识别全局对象。

于是加了一行赋值代码,问题解决:
generate_categories = Category.generate_categories

原来count(None)就不限制最大值了

标签:Google App Engine

今天在GAE论坛里看到的,特意去查了下代码,发现为None时就不调用set_limit(),直接返回总结果数了。(查看请求pb,发现会设为0x7fffffff。)

当然结果集太大时仍然不推荐,毕竟count也是很费时的。

此外fetch仍然没有这种便利,必须传一个整数。

memcache的incr和decr的3处bug

标签:Python, Google App Engine

一般来说,memcache的incr和decr是用来计数的,那么存储和操作的值一般应该是整数。
而据memcache文档所述,它内部采用的是64位无符号整数,且过大会把高位溢出。
这个无符号整数就很无语了,想保存小于0的数都没办法。而且当值为0时,再进行decr操作,值不会溢出,而是仍然为0。

« 看看还有什么好玩意