【问题标题】:How to edit single Entity in GAE (Python)?如何在 GAE (Python) 中编辑单个实体?
【发布时间】:2011-09-06 21:58:23
【问题描述】:

我正在用 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()

我收到此错误。

错误 2011-09-06 21:49:41,562 _webapp25.py:464] 'NoneType' 对象 没有属性“数量”回溯(最近一次调用最后一次):文件 "C:\程序文件 (x86)\Google\google_appengine\google\appengine\ext\webapp_webapp25.py", 第 703 行,在 调用 handler.post(*groups) 文件 “H:\gae-bin\counter.py”,行 48、在岗 counter.amount += 1 AttributeError: 'NoneType' 对象没有 属性“金额”

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

    您用于创建Counter 实体的代码可能有误。它所做的是创建一个Counter 实体,其parentCounter,其键名等于default_counter。这似乎不是您想要的,正如您用于更新计数器的代码所证明的那样。

    您需要通过以下方式之一分配Counter 实体的键名:

    counter = Counter(key_name='default_counter')
    # or
    counter = Counter(key=db.Key.from_path('Counter', 'default_counter'))
    

    请注意,一般来说,设置这样的访问柜台是个坏主意。 GAE 实体有每秒 5 次更新的限制,因此如果您超出此范围,您将遇到问题。

    处理更新限制的常用技术是使用 分片计数器,如下所述:http://code.google.com/intl/pl/appengine/articles/sharding_counters.html。如果您不介意偶尔丢失一些计数器增量,那么数据存储和内存缓存的组合也是一种选择。

    【讨论】:

      【解决方案2】:

      您实际上并没有使用该键创建实体。你应该改变这个:

      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 之类的技术

      【讨论】:

      • 谢谢。但是无论如何都会创建实体。我可以在数据库索引中的 localhost/_ah/admin 中看到。感谢您的链接。我会试试的。
      • 或者您可以直接使用Counter(key_name='default_counter', amount=0) - 无需指定整个密钥。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多