如何处理数据存储区中字段的数据类型更改?
How to handle a datatype change of a field in datastore?
我找不到关于此的任何讨论。特别是,我想知道:
- 是否可以只更改 Objectify 中字段的数据类型,例如从
List<String>
到自定义 class? (我猜是的。)
- 是否可以使用
@IgnoreLoad
或 @AlsoLoad
之类的注释来忽略旧数据类型中的条目? (或者更一般地说,要在旅途中将旧条目迁移到新数据类型?)这是针对具有不同名称的字段记录的,但我担心如果名称保持不变,这是不可能的。
- 如果一个字段具有两种不同数据类型的条目,是否仍然可以将 table 加载到 BigQuery 中(通过数据存储区备份)?
- 是否所有旧条目都是
null
是否相关?
替代解决方案是 reload/save 所有旧条目并使用不同的字段名称,但我对上面列出的问题特别感兴趣。
当然可以。但是您现有的数据将变得无法访问。由于字符串列表(或任何其他 Serializable
class 的列表)由 Objectify 序列化,因此数据存储中的实际数据类型将保留为字符串。
正如您所说,这可以使用不同的名称。我看不出它怎么可能具有相同的值,因为所有序列化的东西对你来说都是黑盒的。 考虑一下... 替代解决方案: 为什么不将字段类型更改为字符串,进行转换并将数据类型更改为预期的类型?您必须模仿 Objectify 的序列化样式,但这应该是可行的。(必须重新考虑这一点,请参阅@stickfigure 的评论)
是也不是。是的,在您的情况下,数据是一个字符串,并且将保留为一个字符串。但是,如果您在 BQ 中使用嵌套模式,这将不起作用,因为您的模式发生了变化。
没有。当您 class 的所有实体在特定字段中都为 null 时,它也会在数据存储区查看器中消失。
Objectify 的文档包括关于架构迁移的部分:
https://github.com/objectify/objectify/wiki/SchemaMigration
使用提供的原语(@OnLoad、@OnSave、@AlsoLoad、@IgnoreSave 等)几乎可以进行任何类型的迁移。它确实非常特定于您要进行的更改。从概念上讲,最简单的方法是创建一个具有不同名称和新类型的新字段,然后使用 @OnLoad 方法导入数据。如果你想重命名该字段,你可以在第二遍中完成。
更复杂的方法是以 'raw' 形式导入数据(例如,将字段类型更改为对象),然后使用 @OnLoad 将其转换到位。这可能很棘手,而且可能不是一个好主意,除非您真的知道自己在做什么。
请记住,如果您的系统很忙,当您切换版本时,旧版本和新版本都会在很短的时间内同时提供服务。因此,为了避免破坏数据,您的系统需要经过一个状态,在该状态下,旧版本和新版本都可以理解两种模式。
我找不到关于此的任何讨论。特别是,我想知道:
- 是否可以只更改 Objectify 中字段的数据类型,例如从
List<String>
到自定义 class? (我猜是的。) - 是否可以使用
@IgnoreLoad
或@AlsoLoad
之类的注释来忽略旧数据类型中的条目? (或者更一般地说,要在旅途中将旧条目迁移到新数据类型?)这是针对具有不同名称的字段记录的,但我担心如果名称保持不变,这是不可能的。 - 如果一个字段具有两种不同数据类型的条目,是否仍然可以将 table 加载到 BigQuery 中(通过数据存储区备份)?
- 是否所有旧条目都是
null
是否相关?
替代解决方案是 reload/save 所有旧条目并使用不同的字段名称,但我对上面列出的问题特别感兴趣。
当然可以。但是您现有的数据将变得无法访问。由于字符串列表(或任何其他
Serializable
class 的列表)由 Objectify 序列化,因此数据存储中的实际数据类型将保留为字符串。正如您所说,这可以使用不同的名称。我看不出它怎么可能具有相同的值,因为所有序列化的东西对你来说都是黑盒的。
考虑一下... 替代解决方案: 为什么不将字段类型更改为字符串,进行转换并将数据类型更改为预期的类型?您必须模仿 Objectify 的序列化样式,但这应该是可行的。(必须重新考虑这一点,请参阅@stickfigure 的评论)是也不是。是的,在您的情况下,数据是一个字符串,并且将保留为一个字符串。但是,如果您在 BQ 中使用嵌套模式,这将不起作用,因为您的模式发生了变化。
没有。当您 class 的所有实体在特定字段中都为 null 时,它也会在数据存储区查看器中消失。
Objectify 的文档包括关于架构迁移的部分:
https://github.com/objectify/objectify/wiki/SchemaMigration
使用提供的原语(@OnLoad、@OnSave、@AlsoLoad、@IgnoreSave 等)几乎可以进行任何类型的迁移。它确实非常特定于您要进行的更改。从概念上讲,最简单的方法是创建一个具有不同名称和新类型的新字段,然后使用 @OnLoad 方法导入数据。如果你想重命名该字段,你可以在第二遍中完成。
更复杂的方法是以 'raw' 形式导入数据(例如,将字段类型更改为对象),然后使用 @OnLoad 将其转换到位。这可能很棘手,而且可能不是一个好主意,除非您真的知道自己在做什么。
请记住,如果您的系统很忙,当您切换版本时,旧版本和新版本都会在很短的时间内同时提供服务。因此,为了避免破坏数据,您的系统需要经过一个状态,在该状态下,旧版本和新版本都可以理解两种模式。