0

Я пытаюсь скопировать модели с одного объекта на другой, сохраняя их автогенерированный идентификатор. Я использую следующий код:«Превышено максимальное количество выделенных идентификаторов» в производстве GAE

key = db.Key.from_path('TargetEntity', source.key().id()) 
db.allocate_id_range(app, start = source.key().id(), end = source.key().id()) 
TargetEntity(key = key).put() 

Это прекрасно работает в dev_appserver, но при запуске этого производства, allocate_id_range броски «превышает максимально выделены идентификаторы». Идентификатор, который он пытается выделить, равен 5093058741796864L.

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

+0

У меня возникли проблемы с создаваемыми вручную идентификаторами, когда я использовал 'db', но они ушли, когда я переключился на' ndb'. Это хорошая идея переключиться на 'ndb' в любом случае. –

ответ

1

Так назад примерно в июне 2013 года по умолчанию для выделения идентификаторов в хранилище данных стал «рассеянные иды»

https://cloudplatform.googleblog.com/2013/05/update-on-datastore-auto-ids.html

Идентификатор вы пытаетесь выделить это рассеянное идентификатор. Идентификаторы, которые выделены_разрядными_разрядами, являются последовательными.

Что вы хотите - функция _reserve_keys, которая работает с идентификаторами SCATTERED и выполняет точную операцию, которую вы хотите (учитывая ключ, сообщите выделение идентификатора, что у вас есть, и что он не должен перераспределять его).

К сожалению, это будет раздражать, чтобы добраться. Он расположен в:

https://cloud.google.com/appengine/docs/python/refdocs/modules/google/appengine/datastore/datastore_rpc

и работает на Protobuf представлений ключей.

Альтернативное решение, которое работает точно так же есть:

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

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

Смежные вопросы