Google app engine 使用对象数据库时,如何处理对象模型的重大更改?

Google app engine 使用对象数据库时,如何处理对象模型的重大更改?,google-app-engine,nosql,objectdatasource,Google App Engine,Nosql,Objectdatasource,如果使用对象数据库,当需要更改对象模型的结构时会发生什么情况 例如,我正在玩谷歌应用程序引擎。当我开发我的应用程序时,我意识到在某些情况下,我错误地命名了一个类,我想更改名称。我有两门课需要巩固 但是,我认为我不能,因为中的类名直观地绑定到数据存储中,并且实际数据存储在这些类名下 我认为,从数据存储中抽象对象模型的“旧方法”的好处在于,数据存储对对象模型一无所知——它只是数据。因此,您可以更改对象模型,并以不同的方式从数据存储中加载数据 因此,一般来说,当使用与您的数据模型密切相关的数据存储时…

如果使用对象数据库,当需要更改对象模型的结构时会发生什么情况

例如,我正在玩谷歌应用程序引擎。当我开发我的应用程序时,我意识到在某些情况下,我错误地命名了一个类,我想更改名称。我有两门课需要巩固

但是,我认为我不能,因为中的类名直观地绑定到数据存储中,并且实际数据存储在这些类名下

我认为,从数据存储中抽象对象模型的“旧方法”的好处在于,数据存储对对象模型一无所知——它只是数据。因此,您可以更改对象模型,并以不同的方式从数据存储中加载数据


因此,一般来说,当使用与您的数据模型密切相关的数据存储时……您如何改变周围的情况?

与您在关系数据库中的做法相同,只是没有一个简单的SQL脚本:

此外,与过去一样,没有属性的对象不会自动获得默认值,模式中不存在的属性仍然作为对象中的幻影挂起


要重命名属性,我希望您可以删除旧属性(幻影挂起)添加新名称,使用旧(幻影)属性的副本填充数据。重新写入的对象将只具有新属性

您可以按照我们在项目中的方式执行此操作:


在更新对象模型(模式)之前,我们使用自定义导出函数和顶部的版本标记将数据导出为json格式的文件或blob。模式更新后,我们使用另一个自定义函数导入json,该函数创建新实体并用旧数据填充它们。当然,导入版本需要知道与每个版本号关联的json格式。

如果您只关心类命名,则可以更改类名而不更改种类(数据存储中使用的标识符):

如果要重命名类,只需实现上述
kind()
方法,并让它返回旧的类名称

如果需要更改数据存储中数据的实际表示形式,则必须运行更新旧数据

class Foo(db.Model):
  @classmethod
  def kind(cls):
    return 'Bar'