我正在建模数据,哪些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?
答案 0 :(得分:2)
基本上不能这样做。您需要一个外部计数器“singleton”,并且如果您需要每秒大约一次写入,则应该为性能添加共享。有关选项的讨论,请参阅How to implement "autoincrement" on Google AppEngine。
答案 1 :(得分:0)
对“self。 class .entity_id”字段的顺序没有意义,因为此字段是唯一的标识符,从不具有增量值,没有任何意义,也没有添加。