【问题标题】:Cant unmarshall dynamodb attribute无法解组 dynamodb 属性
【发布时间】:2018-03-23 03:00:49
【问题描述】:

我正在使用 DynamoDB API 试验 AWS-SDK-GO...

我正在尝试查询数据库并返回一个字符串。但是我在解析返回值时遇到了一些问题......

结构

type Item struct {
     slug string
     destination string
}

查询函数

input := &dynamodb.GetItemInput{
    Key: map[string]*dynamodb.AttributeValue{
        "slug": {
            S: aws.String(slug),
        },
    },
    TableName: db.TableName,
}

result, err := db.dynamo.GetItem(input)
if err != nil {
    return "",  err
}

n := Item{}
err = dynamodbattribute.UnmarshalMap(result.Item, &n)

if err != nil {
    log.Printf("Failed to unmarshal Record, %v", err)
    return "", err
}
log.Printf("dump %+v", n)
log.Printf("echo %s", n.slug)
log.Printf("echo %s", n.destination)
log.Printf("orig %v", result.Item)

结果

2017/10/11 14:21:34 dump {slug: destination:}
2017/10/11 14:21:34 echo 
2017/10/11 14:21:34 echo 
2017/10/11 14:21:34 orig map[destination:{
  S: "http://example.com"
} slug:{
  S: "abcde"
}]

为什么返回的项目是空的?

我试图到处寻找,但没有找到解决方案....

【问题讨论】:

  • dynamodb表中属性destination的数据类型是什么?
  • 把它们都串起来,像结构体
  • 您是否尝试过以下解决方案?
  • 如果你想Unmarshal一个Item实例你必须公开它的属性,只需将每个属性的第一个字母大写

标签: amazon-web-services go amazon-dynamodb aws-sdk-go


【解决方案1】:

我不确定您是否尝试过。我想如果你能改变下面提到的结构,它可能会解决问题。

我假设slugdestination 都被定义/保存为 DynamoDB 表中的字符串属性。

type Item struct {
     Slug string`json:"slug"`
     Destination string`json:"destination"`
}

将打印更改为:-

log.Printf("echo %s", n.Slug)
log.Printf("echo %s", n.Destination)

【讨论】:

    【解决方案2】:

    我发现了这个问题,似乎是相关的,解组结构的特定属性似乎可以做到。

    https://github.com/aws/aws-sdk-go/issues/850

    例子

    var item Item
    if err = dynamodbattribute.Unmarshal(result.Item["destination"], &item.destination); err != nil {
        log.Printf("UnmarshalMap(GetItem response) err=%q", err)
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 2022-01-16
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      相关资源
      最近更新 更多