使用 Go 处理 Google 数据存储中的架构更改?

我向 Go 结构添加了一个新属性,该属性保留在数据存储实体类型中。

我尝试使用新属性上的过滤器加载实体:

q := datastore.NewQuery("Person").Filter("Employed =", false)

这仅适用于添加新属性后创建的人员。

我曾预计在添加属性之前创建的人员会包含在过滤器中,但他们根本没有该属性,因此被过滤器排除在外。

我想了两种方法来处理这个问题:

  • 首先加载所有实体并在第二步中使用循环进行过滤。这增加了代码的复杂性。

  • 批量加载并重新保存所有实体,这会添加属性并将其设置为 false。每次添加新属性时,我都必须记住这样做。

有没有办法处理这些类型的实体模式更改?


慕姐8265434
浏览 153回答 1
1回答

慕村9548890

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

相关分类

Go