【发布时间】:2012-02-13 05:24:32
【问题描述】:
我希望我的 id 为 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 系统,但它是这种情况下唯一的解决方案,我认为这不会造成冲突或重复,如果它可能会很慢实体开始填满,但现在这似乎是一个对用户来说可以接受的解决方案,尽管它看起来可能不是很好看代码:
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()
【问题讨论】:
-
示例代码中的数字与问题文本不匹配。
-
@proppy 那是因为我尝试了 999999999 和 99999999 是否可以有所作为,但没有。
-
为什么不直接使用key_name 而不是id?我认为尝试创建自己的 id 系统没有意义,在分布式环境中这不是一件容易的事。
-
我只需要为我的 ID 设置一个最大值。我并没有发明 ID 有 9 个数字限制的愚蠢 ID 系统,我只是应该对其进行编程的人。而且我不知道如何使用 key_name 代替 ID,因为该数字与 ID 完全相同,它应该作为用户实体的唯一标识符,我唯一的限制是它最多应该是 9 位数字。不能做吗?如果您知道如何使用 key_name 而不是 id 来完成此操作,请发布。
-
要创建具有键名的实体,只需传递一个字符串作为 id 参数:
User(id="my_hand_crafted_id")。
标签: python google-app-engine google-cloud-datastore python-2.7 webapp2