如何正确分配ID?
我想让我的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