Как правильно распределить идентификаторы - PullRequest
4 голосов
/ 13 февраля 2012

Я хочу, чтобы мои идентификаторы были <999999999, но теперь, пытаясь запрограммировать, что это, кажется, имеет противоположный эффект, я только увеличиваю идентификаторы, и когда я пытаюсь выделить идентификаторы start> end?

start, end = User.allocate_ids(max=999999999)
logging.info('start %d' % start)
logging.info('end %d' % end)
lower = start if start < end else end
key = User(id=lower).put()
logging.info('key: '+str(key))
user = key.get()
user.add_auth_id(email)

Мой вывод журнала показывает, что присвоенный идентификатор неверен:

2012-02-13 03:19:07.396 start 98765439124
I 2012-02-13 03:19:07.396 end 98765439123

Как я могу это исправить?

Обновление

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

    new_id = random.randint(1,999999999)
    logging.info('testing new id: %d' % new_id)
    while User.get_by_id(new_id) != None:
        new_id = random.randint(1,999999999)
    logging.info('creating new id: %d' % new_id)
    key = User(id=new_id).put()

1 Ответ

5 голосов
/ 13 февраля 2012

Как объяснено в Документация NDB : allocateIds(max=) вернет первый доступный идентификатор, если вы попытаетесь зарезервировать идентификаторы, которые уже были выделены.

В вашем случае всеидентификаторы до 999999999 уже были назначены ранее (возможно, другими вызовами allocate_ids), 98765439124 - первый доступный идентификатор, 98765439123 - последний, который был выделен.

См. следующеепример:

>>> Foo.allocate_ids(max=26740080011040)
(26740080011031L, 26740080011040L)

Выделить все идентификаторы до 26740080011040

>>> Foo.allocate_ids(max=26740080011040)
(26740080011041L, 26740080011040L)

Все идентификаторы до 26740080011040 уже выделены, первые доступные идентификаторы - 26740080011041последний выделенный номер 26740080011040

>>> Foo.allocate_ids(max=26740080011050)
(26740080011041L, 26740080011050L)

Распределить все идентификаторы до 26740080011050

...