如果使用对象数据库,当需要更改对象模型的结构时会发生什么?
例如,我正在玩Google App Engine。当我正在开发我的应用程序时,我意识到在某些情况下,我错误地命名了一个类,我想更改名称。我有两个课程,我认为我需要巩固。
但是,我不认为我可以,因为类的名称直观地绑定到数据存储区中,并且实际数据存储在这些类名下。
我认为从数据存储中抽象对象模型的“旧方法”的好处是数据存储对对象模型一无所知 - 这只是数据。因此,您可以更改对象模型,只是以不同方式从数据存储区加载数据。
因此,一般来说,当使用与您的数据模型密切相关的数据存储时...您如何改变一切?
答案 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格式。