我向 Go 结构添加了一个新属性,该属性保留在数据存储实体类型中。我尝试使用新属性上的过滤器加载实体:q := datastore.NewQuery("Person").Filter("Employed =", false)这仅适用于添加新属性后创建的人员。我曾预计在添加属性之前创建的人员会包含在过滤器中,但他们根本没有该属性,因此被过滤器排除在外。我想了两种方法来处理这个问题:首先加载所有实体并在第二步中使用循环进行过滤。这增加了代码的复杂性。批量加载并重新保存所有实体,这会添加属性并将其设置为 false。每次添加新属性时,我都必须记住这样做。有没有办法处理这些类型的实体模式更改?
1 回答

慕村9548890
TA贡献1884条经验 获得超4个赞
如果您负担得起,正确的方法是重新保存旧实体。
您可以使用Python map/reduce 库来更新旧实体。
如果您想坚持使用 Go,您可以使用任务队列和查询游标进行简单的批处理。
在我们的 Python 应用程序中,只要可能,我们更喜欢“飞行中的热更新”方法——新版本加载实体并检查缺失的属性。如果某些道具已过时,我们会将它们保留一个月或一个月,然后添加逻辑以删除它们。这允许逐步迁移并且经常回滚而不会出现问题(发生狗屎)或至少将影响限制在一小部分记录。此外,它更具成本效益,因为您无需支付额外的读/写费用。一旦我们确定我们可以运行 mapreduce。这不涉及停机时间。您可能需要或不需要停机时间 - 这实际上取决于您的更改。
使用 Go 可能会有点棘手,因为如果您尝试加载在结构上没有相应字段的实体,Go 会恐慌。应该有一些解决方法(我记得一些关于特殊接口或可以加载任意实体的结构),但我在 GAE 上还没有太多实践经验。
- 1 回答
- 0 关注
- 152 浏览
添加回答
举报
0/150
提交
取消