Nik*_*ntz 4 python google-app-engine python-2.7 webapp2 google-cloud-datastore
我希望我的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)
Run Code Online (Sandbox Code Playgroud)
我的日志输出显示分配的ID错误:
2012-02-13 03:19:07.396 start 98765439124
I 2012-02-13 03:19:07.396 end 98765439123
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
我最终使用的脏的解决方法是制作一种自己的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()
Run Code Online (Sandbox Code Playgroud)
如NDB文档中所述:allocateIds(max=)如果您尝试保留已分配的ID,将返回可用的第一个ID.
在您的情况下,所有ID 999999999之前已经分配过(可能是通过其他调用allocate_ids),98765439124是第一个可用的ID,98765439123是最后一个已分配的ID.
请参阅以下示例:
>>> Foo.allocate_ids(max=26740080011040)
(26740080011031L, 26740080011040L)
Run Code Online (Sandbox Code Playgroud)
分配所有ID最多26740080011040
>>> Foo.allocate_ids(max=26740080011040)
(26740080011041L, 26740080011040L)
Run Code Online (Sandbox Code Playgroud)
已经分配了最多26740080011040的所有ID,第一个可用的ID是26740080011041,最后分配的是26740080011040
>>> Foo.allocate_ids(max=26740080011050)
(26740080011041L, 26740080011050L)
Run Code Online (Sandbox Code Playgroud)
分配所有ID最多26740080011050
| 归档时间: |
|
| 查看次数: |
1278 次 |
| 最近记录: |