4

我希望我的 id 为 < 999999999 但现在试图编程它似乎有相反的效果,我只是让 id 变大,当我尝试分配 id 时 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)

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

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

我怎样才能解决这个问题?

更新

我最终使用的肮脏的解决方法是制作一种我不应该做的自己的 ID 系统,但它是这种情况下唯一的解决方案,我认为这不会造成冲突或重复,如果实体开始填充它可能会很慢up,但是现在这似乎是一个对用户来说可以接受的解决方案,尽管它看起来可能不是很好看代码:

    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()
4

1 回答 1

5

NDB 文档中所述:allocateIds(max=)将返回第一个可用的 id,以防您尝试保留已分配的 ID。

在您的情况下,所有 id999999999之前已经分配过(可能是通过其他调用allocate_ids), 98765439124 是第一个可用的 id, 98765439123 是最后一个已分配的。

请参见以下示例:

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

分配所有 id 到 26740080011040

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

直到 26740080011040 的所有 id 都已分配,第一个可用的 id 是 26740080011041,最后分配的是 26740080011040

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

分配所有 id 到 26740080011050

于 2012-02-13T11:51:41.730 回答