NDB PUT交易被覆盖



我有一个词典,我想整体写给应用引擎上的ndb。问题在于,只有字典中的最后一项才被编写。我以为写作也许太快了,所以我在等待20秒的时间里放了一个睡眠计时器,看看会发生什么。我不断地刷新了数据存储查看器,并看到了交易写入,然后被下一个交易覆盖。一个简单的例子:

class Stats(ndb.Model):
    desc= ndb.StringProperty(required = True)
    count= ndb.IntegerProperty(required = True)
    update = ndb.DateTimeProperty(auto_now_add = True)    
class refresh(webapp2.RequestHandler):
   def get(self):
      statsStore = Stats()
      dict = {"test1":0,"test2":1,"test3":2}
      for key in dict:
         statsStore.desc = key
         statsStore.count = dict.get(key)
         statsStore.put()

上面会发生的事情是,只有最终字典项目将保留在数据存储中。再次使用睡眠计时器,我可以看到每个人都在写作,但随后被覆盖。我在本地机器上使用本地开发GAE环境使用此功能。

感谢帮助。

原始代码的问题是您要重复使用相同的实体(模型实例)。

在第一个put()期间,生成数据存储密钥并将其分配给该实体。然后,所有以下put()调用使用相同的键。

更改它以在每个迭代上创建一个新的模型实例(您在评论中提到的解决方案)将确保每次生成新的数据存储密钥。

另一个选项是在调用put()之前用" statsstore.key = none"清除密钥。但是您所做的可能更好。

不确定您要做什么,但是这里有一些有用的指针。如果要保存dict,然后通过从数据库中读取dict,然后将字符串更改为文本属性,导入json,然后使用json.dumps()将dict作为JSON字符串值保存为JSON String值。如果您想为dict中的每个元素编写一个实体,那么您将需要在for循环中移动statsstore类创建线,并通过将每个stats()类添加到数组中来完成循环过程。循环完成后,您可以将所有实体放入数组中。这种批处理方法比在循环中包括一个put()的速度要快得多,这通常是非常不表现的设计选择。如果您只想在dict中记录所有值以供以后参考,并且您的值可以安全地用作定界符,那么我将在循环之前创建两个空数组各个数组。一旦在数组之外,您可以通过使用定界符字符串连接数组来将这些值保存到实体中的两个文本属性。如果这样做,请强烈建议使用urllib.quote()在附加时逃脱desc文本值,以避免与定界符值发生冲突。

一些最终的意思:您应该小心使用StringProperty使用此类型的过程。根据项目数量和/或DESC值的长度,您可能很容易超过字符串限制大小。还要记住,您在dict中的物品可能不会按照您打算的顺序出现。考虑以下内容:"对于k,v在分类中(mydict.items()):" hth,stevep

最新更新