【问题标题】:id allocated for a new entity was already in use分配给新实体的 id 已在使用中
【发布时间】:2017-05-09 08:26:59
【问题描述】:

我最近将实体从一个命名空间移动到另一个命名空间并添加了一个父对象。从那时起,我注意到出现以下错误:

BadRequestError: the id allocated for a new entity was already in use, please try again: app: "p~appid"
name_space: "xyz"
path <
  Element {
    type: "Challenge"
    name: "chal"
  }
  Element {
    type: "Answer"
    id: 0x14657000000000
  }
>

经过一些研究,我得出的结论是,发生这种情况是因为 id 生成器生成了已经存在的数字 id。由于我将实体移动到另一条路径,因此使用了不同的 id 生成器,并且该生成器不知道现有的 id。

我真的想阻止这种情况,因为这会导致请求不成功。我为旧的db api 找到了许多解决方案,这些解决方案涉及分配麻烦的特定 id,因此生成器知道这些存在。但是我似乎无法为 ndb 模型分配特定的 id。

我尝试使用重试来重试放置模型,但这似乎也无济于事。

有没有办法解决这个问题?

【问题讨论】:

    标签: python google-app-engine app-engine-ndb


    【解决方案1】:

    我尚未对此进行测试,但我认为解决方案是使用 allocate_ids(1, parent=old_parent_key) 并使用 new_parent_key 创建您将使用的实际密钥。

    id = ndb.Model.allocated_ids(size=1, parent=old_parent_key)[0]
    key = ndb.Key(cls, id, parent=new_parent_key).
    

    所以 old_parent_key 是您之前使用的父项,并且您使用 new_parent_key(您现在正在使用)创建密钥。据我所知,allocate_ids 实际上并没有获取实体。

    see ndb id allocation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 2019-01-29
      • 1970-01-01
      相关资源
      最近更新 更多