迁移到High Replication Datastore后,实体密钥不同

时间:2014-07-18 17:33:12

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

我迁移到hrd无法在appspot.com上运行。应用程序数据存储区在原始主/从(MS)和高复制数据存储区(hrd)中都有3种“数据类型”:Group,Pin和Log。每个Group实体都有Pin实体和/或与之关联的Log实体,但这些关联不再适用于hrd(迁移后仍然存在),因此我的应用程序不再有效,我正在寻求帮助恢复它。

下面我将报告数据存储区中前两个Pin实体的实体密钥。我已经在每对的较短的键中插入了一些空格,以便于排列键以查看它们的相似之处。请注意,所有键的开头和结尾都相似,但MS与hrd不同。

Decoded entity key: Group: name=250cc > Pin: id=1
Entity #1 MS  key: ah        NzaW1wbGlmeWNvbm5lY3Rpb25zchkLEgVHcm91cCIFMjUwY2MMCxIDUGluGAEM
Entity #1 hrd key: ahlzfnNpbXBsaWZ5Y29ubmVjdGlvbnMtaHJkchkLEgVHcm91cCIFMjUwY2MMCxIDUGluGAEM


Decoded entity key: Group: name=250cc > Pin: id=5001
Entity #2 MS   key: ah        NzaW1wbGlmeWNvbm5lY3Rpb25zchoLEgVHcm91cCIFMjUwY2MMCxIDUGluGIknDA
Entity #2 hrd  key: ahlzfnNpbXBsaWZ5Y29ubmVjdGlvbnMtaHJkchoLEgVHcm91cCIFMjUwY2MMCxIDUGluGIknDA

To view the app yourself使用此链接。您将看到名为“Playground”的Group并查看其在URL中的调用方式。但是,出现的唯一标记(映射引脚)是自迁移到hrd后添加的标记。

编辑#0

以下是我的Python代码,用于添加保存Pin,其中父级为Group

elif action == "add":
            pin = Pin(parent=place)
            pin.name = self.request.get('details')
            pin.lat = float(self.request.get('lat'))
            pin.lng = float(self.request.get('lng'))
            pin.category = int(self.request.get('category'))
            pin.label = self.request.get('label')
            new_id = pin.put()
            self.response.out.write(new_id)

以下是Pin的类定义。

class Pin(db.Model):
    date = db.DateTimeProperty(auto_now_add=True)
    lat = db.FloatProperty()
    lng = db.FloatProperty()
    name = db.StringProperty()
    cornerColor  = db.StringProperty(default='ffffff')
    height = db.IntegerProperty(default=32)
    label = db.StringProperty(default='')
    labelColor = db.StringProperty(default='000000')
    labelSize = db.IntegerProperty(default=2)
    primaryColor = db.StringProperty(default='ff0000')
    shadowColor = db.StringProperty(default='000000')
    shape = db.StringProperty(default='circle')
    strokeColor = db.StringProperty(default='000000')
    width = db.IntegerProperty(default=32)
    category = db.IntegerProperty(default=0)
    scategory = db.StringProperty()
    logindex = db.IntegerProperty(default=0)
    imageindex = db.IntegerProperty(default=0)
    deleteRequested = db.BooleanProperty(default=False)

编辑#0

编辑#1

毕竟,我的应用程序的问题不在于实体密钥。相反,问题在于我尝试在javascript / html中处理另一个关于风格化标记的已弃用的Google(地图)功能。

我很抱歉这里有噪音。这个问题是由于我无法使用try..catch模式而无法/无效,我尝试将其用作javascript / html模板中的变通方法。

编辑#1

1 个答案:

答案 0 :(得分:1)

预计编码的密钥字符串会发生变化。编码版本包含应用程序的ID。在迁移过程中,使用新的应用程序ID重写密钥。对密钥的引用也同样更新。

如果将密钥存储为db.ReferenceProperty,则在迁移过程中会自动为您更新密钥。

但是如果你要存储像

这样的字符串
  

ahNzaW1wbGlmeWNvbm5lY3Rpb25zchkLEgVHcm91cCIFMjUwY2MMCxIDUGluGAEM

在db.StringProperty()中(或其他类似方式,例如URL的一部分),然后它们将不会更新,您需要自己更新为described in the docs

您为Pin引用的模型似乎并未链接到其他实体,因此不会出现任何问题。