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

时间:2015-10-16 09:04:45

标签: google-app-engine google-bigquery google-cloud-datastore objectify

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

  • 可以只更改Objectify中字段的数据类型,例如从List<String>到自定义课程? (我猜是的。)
  • 是否可以使用@IgnoreLoad@AlsoLoad等注释来忽略旧数据类型中的条目? (或者更一般地说,在移动中将旧条目迁移到新数据类型?)这是针对具有不同名称的字段记录的,但我担心如果名称保持不变,这是不可能的。
  • 如果字段中有两种不同数据类型的条目,是否仍然可以将表加载到BigQuery中(通过数据存储备份)?
  • 是否所有旧条目都是null
  • 是否相关

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

2 个答案:

答案 0 :(得分:1)

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

  2. 正如您所说,这可能有不同的名称。我不知道如何使用相同的值来实现它,因为所有序列化的东西都是黑盒子的。 考虑它...... 替代解决方案:为什么不将字段类型更改为String,进行转换并将数据类型更改为预期的数据类型?你必须模仿Objectify的序列化风格,但这应该是可行的。(必须重新考虑一下,见@stickfigure评论)

  3. 是和否。是的,在您的情况下,数据是一个字符串,将保持字符串。但是,如果您在BQ中使用嵌套模式,那么由于模式更改,这将无效。

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

答案 1 :(得分:1)

Objectify的文档包含有关模式迁移的部分:

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

使用提供的原语(@ OnLoad,@ OnSave,@ AlsoLoad,@ IgnoreSave等)几乎可以进行任何类型的迁移。这对你想要做出的改变非常具体。概念上最简单的方法是创建一个具有不同名称和新类型的新字段,然后使用@OnLoad方法导入数据。如果要重新命名该字段,可以在第二遍中执行此操作。

更复杂的是以“原始”形式导入数据(比如,将字段的类型更改为Object),然后使用@OnLoad将其转换为适当的位置。这可能很棘手,除非你真的知道你在做什么,否则可能不是一个好主意。

请记住,如果您有一个繁忙的系统,当您切换版本时,旧版本和新版本都在服务的时间非常短。因此,为了避免数据丢失,您的系统需要通过旧版本和新版本都理解这两种模式的状态。