如何在GAE中引入所需的财产

时间:2011-02-16 20:29:31

标签: google-app-engine

我已将我的对象更改为在v2中拥有新的必需属性。当我尝试从数据存储区中获取v1对象时,我得到BadValueError,因为v1没有必需的属性。在现有数据上引入新的必需属性的最佳方法是什么

2 个答案:

答案 0 :(得分:6)

我会使用mapreduce库解决此问题。

首先,在mapreduce.yaml注册映射器:

mapreduce:
- name: fixing required property
  mapper:
    input_reader: mapreduce.input_readers.DatastoreInputReader
    handler: your handler
    params:
    - name: entity_kind
      default: main.ModelV2

然后定义process函数来修改实体:

from mapreduce import operation as op
def process(entity):
 if not entity.newproperty :
    entity.newproperty = None
 yield op.db.Put(entity)

如果你正在处理相对较少数量的实体,你可以避免mapreduce直接修改你的实体,如下所示:

entities = ModelV2.all()
for entity in entities :
  if not entity.newproperty :
    entity.newproperty = None
    entity.put()

答案 1 :(得分:3)

您需要将它作为可选属性添加到模型中,获取每个现有实体,向其添加属性(以某种方式生成合理的值),然后将()放入实体。一旦所有现有实体都已“升级”,您就可以使该属性成为必需属性。

AppEngine mapreduce API应该可以很容易。