数据迁移和AppEngine

时间:2011-07-31 21:22:50

标签: python ruby-on-rails-3 google-app-engine data-migration

我在rails中做了很多开发,我正在研究使用python和amp;应用引擎。

从演示项目到目前为止我看到的,我对应用引擎项目有疑问/担忧:

如何在app-engine中处理数据迁移?例如,如果我更改实体/表的名称(例如:文本到文档),或更改现有表中的列(例如:age到dob) - 当发生这种情况时它如何处理旧数据?

谢谢!

2 个答案:

答案 0 :(得分:8)

简短的回答是:它没有处理它。您无法更改实体的名称,您可以更改属性,但您必须手动更新数据。

您的模型定义只是您的应用程序“视图”,了解如何解释存储在数据存储区中的实体。如果我的定义如下:

class MyEntity(db.Model):
    text = db.TextProperty()

运行我的应用程序一段时间,填写我的enties的text属性,然后将列重命名为:

class MyEntity(db.Model):
    description = db.TextProperty()

我现有的所有数据都会保持原样(数据存储区中有很多实体具有填充的text属性。只有当我尝试将实体加载到我的模型实例中时,我才会将它们视为空实体(没有设置description,也无法访问当前存在的text数据。将我的实体保存(放入)到数据存储区将覆盖旧数据,数据将丢失。

如果您对此架构进行此类更改,或者更有可能只更改字段类型。您可以自行预处理数据以处理更改。如果您尝试加载不再符合模型定义的实体,模型层将引发错误。

为了帮助完成更新数据的手动任务,选择的武器是:

  1. remote_api / remote_api_shell.py
  2. mapreduce库(尤其是“mapper”部分)
  3. 使用remote_api [1]设置,您可以打开与实时数据的交互式Python会话,并在本地(大多数情况下)运行脚本,就好像它们直接在生产服务器上运行一样。我发现这是针对小型一次性任务修复/清理数据的最快速最简单的方法。

    如果你有一个更大的任务,可以使用mapper api [2],比如改变数百万个实体,并希望尽可能多地利用这一点。

答案 1 :(得分:1)

您无法更改实体的名称。这是不允许的。

如果更改模型中属性的名称(请不要将它们称为列),AppEngine将忽略旧字段中的旧数据,并为新字段返回None。