我们正在使用google cloud datastore
来存储数据,但遗憾的是,最初没有遵循命名kinds
的名称约定,现在我们要更改数据存储区中现有种类的名称
我们已经积累了大量数据,并且涉及生成数据的大量计算因此再次填充完整数据只是为了重命名一种不是我们的选择。
试过找出来却没有运气。那么有什么我错过了并且可以帮助实现它吗?
答案 0 :(得分:5)
您无法重命名数据存储区中的
kind
,因为类型名称嵌入了数据存储区中每个元素的键。你必须写一个 脚本将所有数据迁移到新的kind
。
答案 1 :(得分:0)
如果您只是想保持代码干净,则可以将代码中的模型别名作为一种简单的解决方案。使用GQL时,您仍然需要通过原始名称来引用您的种类。
正如@Akash Dathan已经说过的那样,您可以通过编写脚本来迁移数据。我将提供更多详细信息:
GQL不能用于这种迁移。请参阅以下文档(适用于Python),该文档指出“ GQL是用于检索实体和键的类似SQL的语言”:
https://cloud.google.com/appengine/docs/standard/python/datastore/gqlreference?csw=1
Python
有关实用的Python示例,请参见幻灯片29“重命名模型:
https://www.slideshare.net/RyanMorlok/data-migrations-in-the-app-engine-datastore
Java
如果您使用的是Java,则可能需要查看Java DataStore API-
如果您的实体管理是使用某种通用的工作单元模式(相当普遍)完成的,那么使用Java DataStore API的基本迁移代码可能类似于:
List<MyKind1> allKind1Entities = myDataService.GetAll(MyKind1);
for (MyKind1 myKind1: allKind1Entities) {
MyKind2 myKind2entity = MyKind1.MapToMyKind2(myKind1);
try {
long myKind2entity Id = myDataService.Add(myKind2entity);
} catch (Exception e) {
e.printStackTrace();
}
}
myDataService.PurgeAll(MyKind1);
如果您要通过包含链接实体的另一个“种类”在实体之间进行任何手动链接,那么它将变得更加复杂,因为您需要更新ID引用(因为新的myKind2
实体将全部有新的ID)
在生产环境中更新架构
如果您的应用程序在应用程序引擎下运行,并且您需要实时更新架构,则可以在此处找到有关在代码中更新模型时的注意事项的更多详细信息-https://cloud.google.com/appengine/articles/update_schema
关于如何在不停机的情况下进行实时迁移,这是Google的一个非常好的YouTube-https://youtube.com/watch?v=qFU5aTT1Eqk