我正在用Python(GAE)做我的第一个小项目,使用查询操作GAE的数据库没有任何困难。但是当涉及到编辑单个实体时,我遇到了一个问题。 我只需要一个简单的计数器,它会在每次访问时增加。 所以我创建了一个实体(这只做一次,只是为了创建实体,然后这个代码从项目中删除):
counter_name = 'default_counter'
def counter_key(counter_n=None):
return db.Key.from_path('Counter', counter_name)
class Counter(db.Model):
amount = db.IntegerProperty()
class CounterClass(webapp.RequestHandler):
def get(self):
counter = Counter(counter_key(counter_name))
counter.amount = 0
counter.put()
没关系。 但是当我尝试增加它时,使用:
counter = db.get(db.Key.from_path('Counter', 'default_counter'))
counter.amount += 1
counter.put()
我收到此错误。
ERROR 2011-09-06 21:49:41,562 _webapp25.py:464]'NoneType'对象 没有属性'amount'跟踪(最近一次调用最后一次):文件 “C:\ Program Files (86)\谷歌\ google_appengine \谷歌\ AppEngine上\分机\ webapp_webapp25.py” 第703行,在通话中 handler.post(* groups)文件 “H:\ gae-bin \ counter.py”,行 48,在帖子中 counter.amount + = 1 AttributeError:'NoneType'对象没有 属性'金额'
我检查了不同的变体,但仍然无法改变实体的价值。 我做错了什么?
提前致谢。
答案 0 :(得分:2)
用于创建Counter
实体的代码可能有误。它的作用是创建一个{strong}父为Counter
且{key}等于Counter
的{{1}}实体。这似乎不是您想要的,正如您用来更新计数器的代码所证明的那样。
您需要通过以下方式之一指定default_counter
实体的键名:
Counter
请注意,一般来说,拥有这样的访问计数器是个坏主意。 GAE实体每秒可以进行5次更新,因此,如果您的规模超出此范围,您将遇到问题。
处理更新限制的常用技巧是使用分片计数器,如下所述:http://code.google.com/intl/pl/appengine/articles/sharding_counters.html。如果您不介意偶尔丢失一些计数器增量,那么数据存储区和内存缓存的组合也是一种选择。
答案 1 :(得分:1)
您实际上并没有使用该密钥创建实体。你应该改变这个:
counter = Counter(db.Key.from_path('Counter', 'default_counter'))
到此:
counter = Counter(key=db.Key.from_path('Counter', 'default_counter'))
由于您立即将金额设置为0
,因此您也可以在初始化实体时执行此操作:
counter = Counter(key=db.Key.from_path('Counter', 'default_counter'), amount=0)
请注意这不是在App Engine上创建计数器的好方法。您需要使用sharded counters或something using memcached
等技术