如何处理数据存储区中字段的数据类型更改?

How to handle a datatype change of a field in datastore?

我找不到关于此的任何讨论。特别是,我想知道:

替代解决方案是 reload/save 所有旧条目并使用不同的字段名称,但我对上面列出的问题特别感兴趣。

  1. 当然可以。但是您现有的数据将变得无法访问。由于字符串列表(或任何其他 Serializable class 的列表)由 Objectify 序列化,因此数据存储中的实际数据类型将保留为字符串。

  2. 正如您所说,这可以使用不同的名称。我看不出它怎么可能具有相同的值,因为所有序列化的东西对你来说都是黑盒的。 考虑一下... 替代解决方案: 为什么不将字段类型更改为字符串,进行转换并将数据类型更改为预期的类型?您必须模仿 Objectify 的序列化样式,但这应该是可行的。(必须重新考虑这一点,请参阅@stickfigure 的评论)

  3. 是也不是。是的,在您的情况下,数据是一个字符串,并且将保留为一个字符串。但是,如果您在 BQ 中使用嵌套模式,这将不起作用,因为您的模式发生了变化。

  4. 没有。当您 class 的所有实体在特定字段中都为 null 时,它也会在数据存储区查看器中消失。

Objectify 的文档包括关于架构迁移的部分:

https://github.com/objectify/objectify/wiki/SchemaMigration

使用提供的原语(@OnLoad、@OnSave、@AlsoLoad、@IgnoreSave 等)几乎可以进行任何类型的迁移。它确实非常特定于您要进行的更改。从概念上讲,最简单的方法是创建一个具有不同名称和新类型的新字段,然后使用 @OnLoad 方法导入数据。如果你想重命名该字段,你可以在第二遍中完成。

更复杂的方法是以 'raw' 形式导入数据(例如,将字段类型更改为对象),然后使用 @OnLoad 将其转换到位。这可能很棘手,而且可能不是一个好主意,除非您真的知道自己在做什么。

请记住,如果您的系统很忙,当您切换版本时,旧版本和新版本都会在很短的时间内同时提供服务。因此,为了避免破坏数据,您的系统需要经过一个状态,在该状态下,旧版本和新版本都可以理解两种模式。