【问题标题】:Why is DynamoDB adding a NULL suffix to attribute names?为什么 DynamoDB 为属性名称添加 NULL 后缀?
【发布时间】:2020-04-22 05:44:20
【问题描述】:

我一直在做一个玩具项目,并注意到 dynamo 在我的两个属性名称中添加了一个 (NULL) 后缀。我以前没有注意到,所以我认为它一定是在我的代码更改之一之后发生的。我在网上找不到任何关于这种行为的参考。

我正在运行的脚本是一个简单的PutItem,来自官方 Dynamodb 文档,我在表格中插入了一些模拟用户。

func InsertModel(m interface{}) error {
    av, err := dynamodbattribute.MarshalMap(m)
    if err != nil {
        return fmt.Errorf("handlers: Got error marshalling map: %v", err)
    }

    input := &dynamodb.PutItemInput{
        Item:                av,
        TableName:           aws.String(appTableName),
        ConditionExpression: aws.String("attribute_not_exists(PK) AND attribute_not_exists(SK)"),
    }

    _, err = svc.PutItem(input)
    if err != nil {
        return fmt.Errorf("handlers: Got error calling PutItem: %v", err)
    }

    return nil
}

m(用户模拟数据)的所有字段类型为string

UserModel{PK: "910cc6d8-b7e2-dfg6-d8d4-sh6d0e3fde6b", SK: "user_info", Name: "bla", ImageURI: "aaa"},

当我删除“名称”和“ImageURI”字段时,PutItem 会在字段值中插入一个布尔值 true,如下所示。

这是MarshalMap操作后av中的值。

  1. 填充了“名称”和“ImageURI”字段:
map[ImageURI:{
  S: "aaa"
} Name:{
  S: "bla"
} PK:{
  S: "910cc6d8-b7e2-dfg6-d8d4-sh6d0e3fde6b"
} SK:{
  S: "user_info"
}]
  1. 这里没有“名称”和“ImageURI”,如UserModel{PK: "910cc6d8-b7e2-dfg6-d8d4-sh6d0e3fde6b", SK: "user_info"}
map[ImageURI:{
  NULL: true
} Name:{
  NULL: true
} PK:{
  S: "910cc6d8-b7e2-dfg6-d8d4-sh6d0e3fde6b"
} SK:{
  S: "user_info"
}]

我试图从表中删除所有记录并再次插入,但行为仍在继续。此外,我对int 类型属性执行了相同的过程(插入具有填充和未填充的 int 属性的对象),当它未填充时我得到 0(这是我所期望的)。我尝试使用不同的字符串类型属性复制它,并且得到相同的行为(为空时为真),但属性名称没有获得后缀 NULL。

总而言之,在我的例子中,这种行为似乎主要发生在 string 类型上,我只在属性“Name”和“ImageURI”中得到一个 NULL 后缀,但在其他字符串属性上没有我试过了(也不是 int 的)。

【问题讨论】:

    标签: amazon-dynamodb aws-sdk-go


    【解决方案1】:

    我的表格项目的一个字段遇到了同样的问题。
    对于该字段,我正在使用 NameMap 选项进行更新,当您想要使用由于某些其他原因而由 dynamo 保留的名称时很有用。 我只是尝试不使用 NameMap 选项,为我的字段提供另一个名称,然后该后缀消失了。 我希望我的经验能有所帮助。 问候

    【讨论】:

      【解决方案2】:

      选项 A

      dynamodbattribute.MarshalMap 方法读取 json 结构标记(如果存在)。通过添加omitempty,它将使该属性脱离项目。那么以后再读回来的时候,会默认为struct中的空值。

      type Foo struct {
          Bar string `json:"bar,omitempty"`
      }
      

      选项 B

      您可以通过创建自己的dynamodb.AttributeValue 或在您的结构上实现编组器接口来显式设置空结构值。例如:

      item := map[string]*dynamodb.AttributeValue{
        "Foo": {
          S: aws.String("")
        }
      }
      

      使 (NULL) 后缀消失

      删除带有(NULL) 后缀的列中包含NULL 值的所有行后,后缀似乎需要一些时间才能从AWS UI 中消失。当我对此进行测试时,大约需要 12 个小时。

      讨论

      在 github 上继续讨论 null 行为。

      【讨论】:

        猜你喜欢
        • 2016-11-15
        • 2020-11-24
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 2023-01-05
        • 2012-06-18
        • 1970-01-01
        相关资源
        最近更新 更多