Идентификатор, выделенный для нового объекта, уже используется
Недавно я переместил сущности из пространства имен в другое пространство имен и добавил родителя. С тех пор я заметил следующую ошибку:
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 на самом деле не выбирает сущности.