get_or_insert,如何知道它的创建或检索?

时间:2012-01-04 04:25:44

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

我想使用get_or_insert,但我怎么知道它只是从现有条目创建或获取的。

1 个答案:

答案 0 :(得分:7)

简而言之,你做不到。 get_or_insert只是一个便利功能,你可以很容易地为自己编写和改进。这是一个返回元组的简单替换,指示它是否已创建:

@classmethod
def my_get_or_insert(cls, key_name, parent=None, **kwargs):
  def _tx():
    entity = cls.get_by_key_name(key_name, parent=parent)
    if entity:
      return entity, False
    entity = cls(key_name=key_name, parent=parent, **kwargs)
    entity.put()
    return entity, True
  return db.run_in_transaction(_tx)

以下是你如何使用它:

entity, created = MyKind.my_get_or_insert('foo', bar=123)
if created:
  # Do whatever you do with a new entity here.

请记住,如果您将其与上述配方一起使用,那么根据实体是否为新实体而执行的任何操作都不是事务性的 - 您的代码在创建实体之后但在执行此操作之前可能会失败。如果你想做什么有副作用,你应该在交易中做。