使用 Go 处理 Google 数据存储中的架构更改?
Handle schema change in Google datastore with Go?
我向 Go 结构添加了一个新属性,持久化在数据存储实体种类中。
我尝试在新属性上使用过滤器加载实体:
q := datastore.NewQuery("Person").Filter("Employed =", false)
这仅适用于添加新属性后创建的人员。
本来以为添加属性前创建的人会被过滤,结果他们根本没有属性,所以被过滤掉了。
我想到了两种处理方式:
- 首先加载所有实体并在第二步循环过滤。这增加了代码的复杂性。
- 批量加载并重新保存所有实体,这会添加 属性 并将其设置为 false。每次添加新属性时,我都必须记住这样做。
是否有更好的方法来处理这些类型的实体架构更改?
正确的方法是在负担得起的情况下重新保存旧实体。
您可以使用 Python map/reduce library 更新旧实体。
如果你想坚持使用 Go,你可以使用 task queues & query cursors 进行简单的批处理。
在我们的 Python 应用程序中,只要有可能,我们更喜欢 "in-flight hot update" 方法 - 新版本加载实体并检查缺少的属性。如果某些道具已过时,我们会将它们保留一个月或一个月,然后添加逻辑以删除它们。这允许逐渐迁移并且经常回滚而不会出现问题(发生错误)或至少将影响限制在一小部分记录中。此外,它更具成本效益,因为您无需支付额外的费用 reads/writes。一旦我们确定我们可以,我们就可以 运行 一个 mapreduce。这不涉及停机时间。您可能需要或不需要停机时间 - 这实际上取决于您的更改。
使用 Go 可能有点棘手,因为如果您尝试加载在结构上没有对应字段的实体,Go 会恐慌。应该有一些解决方法(我记得一些关于特殊接口或结构的东西,你可以在其中加载任意实体)但我还没有太多关于 GAE 上的实践经验。
我向 Go 结构添加了一个新属性,持久化在数据存储实体种类中。
我尝试在新属性上使用过滤器加载实体:
q := datastore.NewQuery("Person").Filter("Employed =", false)
这仅适用于添加新属性后创建的人员。
本来以为添加属性前创建的人会被过滤,结果他们根本没有属性,所以被过滤掉了。
我想到了两种处理方式:
- 首先加载所有实体并在第二步循环过滤。这增加了代码的复杂性。
- 批量加载并重新保存所有实体,这会添加 属性 并将其设置为 false。每次添加新属性时,我都必须记住这样做。
是否有更好的方法来处理这些类型的实体架构更改?
正确的方法是在负担得起的情况下重新保存旧实体。
您可以使用 Python map/reduce library 更新旧实体。
如果你想坚持使用 Go,你可以使用 task queues & query cursors 进行简单的批处理。
在我们的 Python 应用程序中,只要有可能,我们更喜欢 "in-flight hot update" 方法 - 新版本加载实体并检查缺少的属性。如果某些道具已过时,我们会将它们保留一个月或一个月,然后添加逻辑以删除它们。这允许逐渐迁移并且经常回滚而不会出现问题(发生错误)或至少将影响限制在一小部分记录中。此外,它更具成本效益,因为您无需支付额外的费用 reads/writes。一旦我们确定我们可以,我们就可以 运行 一个 mapreduce。这不涉及停机时间。您可能需要或不需要停机时间 - 这实际上取决于您的更改。
使用 Go 可能有点棘手,因为如果您尝试加载在结构上没有对应字段的实体,Go 会恐慌。应该有一些解决方法(我记得一些关于特殊接口或结构的东西,你可以在其中加载任意实体)但我还没有太多关于 GAE 上的实践经验。