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

时间:2011-04-05 17:38:45

标签: google-app-engine nosql objectdatasource

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

如果您想重命名您的课程,只需实施上述kind()方法,并让它返回旧的姓名。

如果您需要更改数据存储区中数据的实际表示,则必须运行mapreduce来更新旧数据。

答案 1 :(得分:1)

与关系数据库中的方法相同,除非没有简单的简单SQL脚本:http://code.google.com/appengine/articles/update_schema.html

此外,就像过去一样,没有属性的对象不会自动获取默认值,并且架构中不存在的属性仍然作为对象中的幻像出现。

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

答案 2 :(得分:0)

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

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