App Engine数据存储区:使用NDB进行ID自动增量

时间:2012-04-24 11:38:32

标签: python google-app-engine auto-increment datastore

我正在建模数据,哪些ID应该是自动增量。实际上,我已经制作了工作模型,但需要一些来自数据存储大师的建议。

我的ID生成代码:

class AutoIncrementModel(ndb.Model):
  entity_id = ndb.IntegerProperty('eID')
  def _pre_put_hook(self):
    if self.key and self.key.id(): return
    latest = self.__class__.query().order(-self.__class__.entity_id).get()
    self.entity_id = latest and latest.entity_id + 1 or 1
    while self.__class__.get_by_id(self.entity_id): self.entity_id += 1
    self.key = ndb.Key(self.__class__.__name__, self.entity_id, parent=self.key and self.key.parent() or None)
    self.put()

此代码生成简单的ID,但我不太确定它是否足够好。

UPD 此代码失败。可以使用相同的密钥写入多个实体,并且可以覆盖数据。

№1。它会导致数据丢失问题吗? “while loop”保留应用程序生成ID。但我不确定是否有可能覆盖数据。

№2。像这样的交易可以更好地保存吗?

  def _pre_put_hook(self):
    def callback():
      while self.__class__.get_by_id(self.entity_id): self.entity_id += 1
      self.key = ndb.Key(self.__class__.__name__, self.entity_id, parent=self.key and self.key.parent() or None)
      self.put()
    if self.key and self.key.id(): return
    latest = self.__class__.query().order(-self.__class__.entity_id).get()
    self.entity_id = latest and latest.entity_id + 1 or 1
    ndb.transaction(callback, xg=True)

UPD :交易有助于避免数据丢失。这段代码似乎比第一个例子好得多。

№3。有没有办法从没有额外字段索引的实体组中获取最大ID?

2 个答案:

答案 0 :(得分:2)

基本上不能这样做。您需要一个外部计数器“singleton”,并且如果您需要每秒大约一次写入,则应该为性能添加共享。有关选项的讨论,请参阅How to implement "autoincrement" on Google AppEngine

答案 1 :(得分:0)

对“self。 class .entity_id”字段的顺序没有意义,因为此字段是唯一的标识符,从不具有增量值,没有任何意义,也没有添加。