Python 迁移到高复制数据存储后,实体密钥不同
我向hrd的迁移在appspot.com上不起作用。应用程序数据存储在原始主/从(MS)和高复制数据存储(hrd)中都有3种“类型”的数据:Python 迁移到高复制数据存储后,实体密钥不同,python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我向hrd的迁移在appspot.com上不起作用。应用程序数据存储在原始主/从(MS)和高复制数据存储(hrd)中都有3种“类型”的数据:组、Pin和日志。每个组实体都有与之关联的Pin实体和/或日志实体,但这些关联在hrd中不再有效(这是迁移后的全部),因此我的应用程序不再有效,我正在寻求帮助以恢复它 下面我报告数据存储中前两个Pin实体的实体键。我在每对钥匙的较短钥匙中插入了一些空格,以便于排列钥匙,查看它们的相似之处。请注意,所有键的开始和结束方式都类似,但MS和hrd不同 Decode
组、Pin和日志。每个组
实体都有与之关联的Pin实体和/或日志实体,但这些关联在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
使用此链接。您将看到名为“游乐场”的组
,并查看它在URL中的调用方式。但是,出现的唯一标记(贴图接点)是自迁移到hrd后添加的标记
编辑#0
下面是我的Python代码,用于在父级为组的情况下添加保存Pin
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
毕竟,我的应用程序的问题不在于实体键。相反,问题在于我试图处理另一个不推荐的Google(Maps)特性的方式,该特性涉及javascript/html中的样式化标记
对不起,这里太吵了。这个问题是由于我尝试在javascript/html模板中使用try..catch模式作为解决方法时的无能/无能造成的
编辑#1编码的密钥字符串预计会更改。编码版本包含应用程序的Id。在迁移过程中,使用新的应用程序Id重新写入密钥。对密钥的引用也同样更新
如果将密钥存储为db.ReferenceProperty,则在迁移过程中会自动为您更新该密钥
但是,如果存储字符串,如
AHNZAW1WBGLMEWNWVBM5LY3RPB25ZCHKLEGVHCM91CCIFMJUWY2MMCXIDUGLGAEM
在db.StringProperty()中(或其他类似方式,例如URL的一部分),它们将不会被更新,您需要将自己更新为
您为Pin引用的模型似乎没有链接到其他实体,因此不会出现任何问题。这可能更适合应用程序引擎生产票据,以便有人可以深入挖掘数据。我建议在这里输入一个bug:它不是bug。在迁移指南中有很好的记录,手动保存的ID不会迁移,因为所有ID都会在hdr中更改。我使用的过程中“手动保存”了什么?我使用了appengine自动化流程(正如我们在SO中讨论的)[。这可能取决于您在不同实体中存储引用的方式。自动迁移工具应处理存储为数据存储密钥的任何属性。但是,如果您仅存储id或序列化密钥,则必须手动迁移它们:。请查看我添加的代码的编辑问题。是否存在问题?这对主从来说很管用。