为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

1 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

如果您负担得起,正确的方法是重新保存旧实体。

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

如果您想坚持使用 Go,您可以使用任务队列查询游标进行简单的批处理。

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

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


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号