在Google App Engine中更新模型架构?

时间:2010-05-25 17:03:02

标签: google-app-engine model

Google建议一次将一个条目更改为默认值....

http://code.google.com/appengine/articles/update_schema.html

我有一个拥有一百万行的模型,使用网络浏览器这样做会花费我很多年。另一个选择是使用任务队列运行它,但这将花费我很多的CPU时间

任何简单的方法吗?

3 个答案:

答案 0 :(得分:4)

由于数据存储区是无架构的,因此您必须在模型的每个实例上添加或删除属性。使用任务队列应该使用与其他任何方式相同的CPU数量,所以请继续使用。

在完成所有这些工作之前,请确保您确实需要这样做。如您链接到的文章中所述,并非特定模型的所有实体都需要具有相同的属性集。为什么不更改您的Model类以检查是否存在新的或已删除的属性,并在您碰巧写入它时更新该实体。

答案 1 :(得分:3)

我建议使用低级GAE API进行迁移,而不是the docs建议的内容。

以下代码将迁移DbMyModel类型的所有项目:

    如果不退出,则会添加
  • new_attribute
  • 如果存在,
  • old_attribute将被删除。
  • changed_attribute将从布尔转换为字符串(True转换为优先级1 False转换为优先级3

请注意query.Run返回迭代器返回Entity个对象。 Entity个对象的行为与dict s:

完全相同
from google.appengine.api.datastore import Query, Put
query = Query("DbMyModel")
for item in query.Run():
    if not 'new_attribute' in item:
        item['attribute'] = some_value
    if 'old_attribute' in item:
        del item['old_attribute']
    if ['changed_attribute'] is True:
        item['changed_attribute'] = 'Priority 1'
    elif ['changed_attribute'] is False:
        item['changed_attribute'] = 'Priority 3'
    #and so on...
    #Put the item to the db:
    Put(item)

如果您只需要选择一些记录,请参阅google.appengine.api.datastore模块的源代码以获取大量文档和示例,了解如何创建过滤查询。

使用此方法,删除/添加属性更简单,并且在已经更新应用程序模型时避免出现问题,而不是GAE建议的方法。

例如,现在必需的字段可能不存在(还),导致迁移时出错。删除字段不适用于静态属性。

答案 2 :(得分:1)

这对OP没有帮助,但可能会帮助谷歌玩家使用一个小应用程序:我做了Alex建议的,但更简单。显然这不适合生产应用程序。

  1. 部署App Engine控制台
  2. 在Web解释器内针对您的实时数据存储编写代码
  3. 像这样:

    from models import BlogPost  
    for item in BlogPost.all():  
        item.attr="defaultvalue"  
        item.put()