改变DynamoDB属性数据类型时如何保证向后兼容性



我试图更改我的一个DDB表中的一个属性的数据类型,但是因为这个数据是读写的,所以更改属性的数据类型会导致在读取旧记录时读取失败,如下所示:

could not unconvert attribute
DynamoDBMappingException: expected M in value {N: 1000,}

我的问题是关于如何更改表中属性的数据类型,并构建更改,以便我仍然可以读取以前记录中存在的Double值。下面是所讨论的类:

@DynamoDBTable(tableName = "Sections")
@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SectionRecord {
@DynamoDBHashKey
private String id;
private Map<String, Double> sectionTarget; //previous definition: private Double sectionTarget;

public void setSectionTarget(Double sectionTarget, String key) {
if (this.sectionTarget == null) {
this.sectionTarget = new HashMap<Double, String>();
}
this.sectionTarget.put(key, sectionTarget);
}

public void getSectionTarget(String key) {
return this.sectionTarget.get(key);
}
}

最后,我尝试像这样读取记录:

mapper.load(SectionRecord.class, id);

这大概是问题的来源-我试图读取一个Double(目前存在于ddb)作为映射(我对属性所做的更改)。

我希望听到一些关于如何最好地构建这样的更改以减轻这些向后兼容性问题的指导。

你必须

  • 在dynamo和SectionRecord
  • 中用新类型创建一个新属性
  • 你的代码应该能够读取和使用
  • 将其部署到生产环境中,并等待旧数据消失(或创建自定义迁移逻辑)
  • 删除旧字段,逻辑现在只能依赖于新字段

欢迎使用没有DB迁移的dynamo (

)