get_or_insert,如何知道它是创建还是检索?

发布于 2024-12-25 00:32:21 字数 167 浏览 1 评论 0原文

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

I want to use get_or_insert, But how do I know that it's just created or fetched from existing entries.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

裸钻 2025-01-01 00:32:21

简而言之,你不能。不过,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.

请记住,如果您将它与上面的配方一起使用,则您所做的任何事情都将基于该实体是否是新的or not 不是事务性的 - 您的代码可能会在创建实体之后但执行此操作之前失败。如果您想做的事情有副作用,您可能应该在事务内进行。

In a nutshell, you can't. get_or_insert is just a convenience function, though, and one you can write and improve for yourself quite easily. Here's a simple replacement that returns a tuple, indicating if it was created or not:

@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)

And here's how you'd use it:

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

Just bear in mind that if you use it with the recipe above, anything you do based on whether the entity is new or not is not transactional - your code could fail after creating the entity but before doing that. If what you want to do has side-effects, you should probably do it inside the transaction.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文