具有相同ID的多个数据存储区实体!

时间:2010-11-19 03:11:18

标签: google-app-engine google-cloud-datastore

我遇到了一个很大的问题 - 我同类数据存储区中的多个实体具有相同的ID!它们的键是Key s,但我一直假设key.getId()将返回一个在同类所有实体中唯一的数字。

不是这样!不同的密钥可以返回相同的ID! Aurgh!我可以通过使用数据查看器来确认这一点 - 在id / name列中具有相同值的多个实体。具有重复键的实体都在不同的实体组中 - 它们具有不同的父键。我没有在同一个实体组中看到任何重复ID,但我不知道这不会发生。

  1. 这是正常的吗?
  2. 有没有办法获得自动生成的唯一数字标识符?我知道我可以提供自己的id值,但为此实现我自己的系统似乎极端!

3 个答案:

答案 0 :(得分:5)

密钥不仅包括id或密钥名称 - 它还包括种类,父级和应用程序ID。这就是为什么多个实体可能共享密钥的相同ID部分 - 只要密钥的某个其他组件不同,它就完全没问题。

如果您要生成唯一 ID,请使用db.allocate_ids方法。

答案 1 :(得分:1)

数据存储使用keys识别实体(您还可以在keys上看到Java文档,但我相信Python文档可以解释一下)。关于storage breakdown的文章有点过时,但仍然有用。

底线是实体由数据存储区中的完整路径标识,包括实体的父级。因此,要识别孩子,您还需要包含父母的ID。

答案 2 :(得分:0)

我遇到了同样的问题并达成了这个主题。我遇到了这些ID的问题,因为我用它们来识别HTML中的这类实体,例如:

<li id={{ entity.id }}>{{ entity.value }}</li>

我在DOM上有重复的ID,但是你给了我答案:数据存储可能不会在同一个父组中重复ID,如this part of the documentation所述:

  

“换句话说,一个对象必须具有唯一的ID   具有相同类型且具有相同实体组父对象的对象(如果   任何)”,

所以我将根据父命名密钥(可能是一个ID)生成一个id,并使用这个懒惰生成的数字来识别DOM上的实体。

蟒:

entity_rs = Entity.all()
entities = []
for entity in entity_rs:
    entity.id = '%s-%s' % (entity.parent().key().id_or_name(), entity.key().id_or_name())
    entities.append(entity):

HTML:

<ul>
{% for entity in entities %}
    <li id="{{ entity.id }}">{{ entity.value }}</li>
{% endfor %}
</ul>

我知道它不漂亮,但(在某些条件下)它有效。