我在rails中做了很多开发,我正在研究使用python和amp;应用引擎。
从演示项目到目前为止我看到的,我对应用引擎项目有疑问/担忧:
如何在app-engine中处理数据迁移?例如,如果我更改实体/表的名称(例如:文本到文档),或更改现有表中的列(例如:age到dob) - 当发生这种情况时它如何处理旧数据?
谢谢!
答案 0 :(得分:8)
简短的回答是:它没有处理它。您无法更改实体的名称,您可以更改属性,但您必须手动更新数据。
您的模型定义只是您的应用程序“视图”,了解如何解释存储在数据存储区中的实体。如果我的定义如下:
class MyEntity(db.Model):
text = db.TextProperty()
运行我的应用程序一段时间,填写我的enties的text
属性,然后将列重命名为:
class MyEntity(db.Model):
description = db.TextProperty()
我现有的所有数据都会保持原样(数据存储区中有很多实体具有填充的text
属性。只有当我尝试将实体加载到我的模型实例中时,我才会将它们视为空实体(没有设置description
,也无法访问当前存在的text
数据。将我的实体保存(放入)到数据存储区将覆盖旧数据,数据将丢失。
如果您对此架构进行此类更改,或者更有可能只更改字段类型。您可以自行预处理数据以处理更改。如果您尝试加载不再符合模型定义的实体,模型层将引发错误。
为了帮助完成更新数据的手动任务,选择的武器是:
使用remote_api [1]设置,您可以打开与实时数据的交互式Python会话,并在本地(大多数情况下)运行脚本,就好像它们直接在生产服务器上运行一样。我发现这是针对小型一次性任务修复/清理数据的最快速最简单的方法。
如果你有一个更大的任务,可以使用mapper api [2],比如改变数百万个实体,并希望尽可能多地利用这一点。
答案 1 :(得分:1)
您无法更改实体的名称。这是不允许的。
如果更改模型中属性的名称(请不要将它们称为列),AppEngine将忽略旧字段中的旧数据,并为新字段返回None。