如何正确分配ID?

4 投票
1 回答
1543 浏览
提问于 2025-04-17 12:56

我想让我的ID小于999999999,但现在在编程时似乎出现了相反的效果,我得到的ID都是更大的,而且当我尝试分配ID时,开始的值大于结束的值?

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)

我的日志输出显示分配的ID是错误的:

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

根据NDB文档的说明,allocateIds(max=)这个函数会返回第一个可用的ID,如果你尝试预留已经被分配的ID。

在你的情况中,所有小于或等于999999999的ID都已经被分配过了(可能是之前其他调用allocate_ids时分配的),所以98765439124是第一个可用的ID,而98765439123是最后一个被分配的ID。

看看下面的例子:

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

预留所有小于或等于26740080011040的ID

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

所有小于或等于26740080011040的ID已经被分配,第一个可用的ID是26740080011041,最后一个被分配的ID是26740080011040

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

预留所有小于或等于26740080011050的ID

撰写回答