Google建议一次将一个条目更改为默认值....
http://code.google.com/appengine/articles/update_schema.html
我有一个拥有一百万行的模型,使用网络浏览器这样做会花费我很多年。另一个选择是使用任务队列运行它,但这将花费我很多的CPU时间
任何简单的方法吗?
答案 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建议的,但更简单。显然这不适合生产应用程序。
from models import BlogPost
for item in BlogPost.all():
item.attr="defaultvalue"
item.put()