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

Handle schema change in Google datastore with Go?

我向 Go 结构添加了一个新属性,持久化在数据存储实体种类中。

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

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

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

本来以为添加属性前创建的人会被过滤,结果他们根本没有属性,所以被过滤掉了。

我想到了两种处理方式:

是否有更好的方法来处理这些类型的实体架构更改?

正确的方法是在负担得起的情况下重新保存旧实体。

您可以使用 Python map/reduce library 更新旧实体。

如果你想坚持使用 Go,你可以使用 task queues & query cursors 进行简单的批处理。

在我们的 Python 应用程序中,只要有可能,我们更喜欢 "in-flight hot update" 方法 - 新版本加载实体并检查缺少的属性。如果某些道具已过时,我们会将它们保留一个月或一个月,然后添加逻辑以删除它们。这允许逐渐迁移并且经常回滚而不会出现问题(发生错误)或至少将影响限制在一小部分记录中。此外,它更具成本效益,因为您无需支付额外的费用 reads/writes。一旦我们确定我们可以,我们就可以 运行 一个 mapreduce。这不涉及停机时间。您可能需要或不需要停机时间 - 这实际上取决于您的更改。

使用 Go 可能有点棘手,因为如果您尝试加载在结构上没有对应字段的实体,Go 会恐慌。应该有一些解决方法(我记得一些关于特殊接口或结构的东西,你可以在其中加载任意实体)但我还没有太多关于 GAE 上的实践经验。