如何在GAE(Python)中编辑单个实体?

时间:2011-09-06 21:58:24

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

我正在用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'对象没有   属性'金额'

我检查了不同的变体,但仍然无法改变实体的价值。 我做错了什么?

提前致谢。

2 个答案:

答案 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 counterssomething using memcached

等技术