Идентификатор, выделенный для нового объекта, уже используется

Недавно я переместил сущности из пространства имен в другое пространство имен и добавил родителя. С тех пор я заметил следующую ошибку:

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
  }
>

После некоторых исследований я пришел к выводу, что это происходит потому, что генератор идентификаторов генерирует уже существующие числовые идентификаторы. Поскольку я переместил сущности на другой путь, используется другой генератор идентификаторов, и этот генератор не знает о существующих идентификаторах.

Я действительно хочу предотвратить это, так как это приводит к неудачным запросам. Я нашел множество решений для пожилых db API, которые включают выделение определенных идентификаторов, которые являются проблематичными, чтобы генератор знал, что они существуют. Однако я не могу выделить конкретный идентификатор для модели 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 на самом деле не выбирает сущности.

см. распределение идентификаторов ndb

Другие вопросы по тегам