如何正确分配_?

时间:2012-02-13 05:24:33

标签: python google-app-engine google-cloud-datastore python-2.7 webapp2

我想要我的ids< 999999999但现在尝试编程它似乎有相反的效果,我只是让id更大,当我尝试分配ids开始>结束?

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 个答案:

答案 0 :(得分:5)

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

在您的情况下,之前已经分配了999999999之前的所有ID(可能是通过对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