【问题标题】:How to allocate_ids correctly?如何正确分配_ids?
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 感谢您的回答,但我仍然无法根据我的规范创建 ID。我的 ID 应该类似于 460000005005,我可以将此 ID 视为 5005,因为 46 是国家代码的虚拟变量。我没有发明那个 ID 系统,我只是应该对其进行编程的人。它自然仅限于大小为 999999999 的 ID,因此发现我无法分配较低的 ID 真的只是把钉子放在我的棺材里,并没有解决任何问题。难道不应该多次向数据存储询问低 ID 吗?看来我只能做一次,然后分配所有ID。
  • 如果您正在寻找手工制作的 ID,您绝对应该使用 key_name,正如评论中建议的 Shay Erlichmen。
  • 和appengine ID一模一样,但以460开头,最多9位。所以我创建了一个名为 makeid 的过滤器,它只显示来自 appengine ID 的我的 ID,我的整个应用程序都是这样构建的。现在看来我分配了所有可以使用的 ID,并且没有办法释放它们。我想要一个简单的解决方案,但我不知道如何使用 Key_name 创建唯一的数字,因为我的 ID 也应该是唯一的数字,更像是连续的但不一定 - 重要的是数字最多有 9 位。跨度>
  • 查看我对您问题的评论。
  • 我认为它现在可以接受了。为了满足我的奇怪要求(ID 必须小于 10000000),我在该范围内生成一个新的随机数,检查它是否被采用,如果不是通常情况,它会创建一个新的用户对象,该 ID 作为它的数字标识。即使我得到建议使用 key_string 而不是数字键,它似乎也可以工作,但我还需要使用此 ID 来唯一标识许多用户列表中的用户。
猜你喜欢
  • 2017-02-09
  • 2016-03-11
  • 2011-03-05
  • 1970-01-01
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
相关资源
最近更新 更多