繁体   English   中英

可以在不使用结构的情况下在 Golang 的 DynamoDB 中运行 PutItem 吗?

[英]Can one run a PutItem in DynamoDB in Golang without using a struct?

AWS 的所有示例都涉及在使用 DynamoDB 执行任何操作之前使用结构来组织和优化您的数据。 请参阅: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/dynamo-example-create-table-item.html

对于我的项目,我从第三方 API 获得了 JSON 字符串。 我实际上想将整个 JSON object 存储在 DynamoDB 中,但我无法确定没有结构是否可行。 因为我正在与第三方 API 合作,所以我无法保证我将获得哪些字段,或者这些字段将来是否会更改。 这可以做到吗? 在 NodeJS 中这很容易,但我知道 Go 是静态类型的,所以它可能是不可能的。

您可以使用 map[string]interface{} 类型的 var 吗? 并解组到那个?

见: https : //play.golang.org/p/PlaitcaPe5D

您将始终需要一个结构用于您的项目 static 键和/或范围。 JSON 可以 go 在另一个类型为map的字段中,该字段可以包含项目或嵌套映射。 然后让attributevalue.MarshalMap将整个结构转换为DynamoDB map

type Record struct {
    ID   string
    JSON map[string]interface{}
}

r := Record{
    ID:   "ABC123",
    JSON: map[string]interface{}{
        "Parent": "aa",
        "Children": map[string]interface{}{
            "Child1": "foo",
            "Child2": "bar",
        },
    },
}

av, err := attributevalue.MarshalMap(r)
if err != nil {
    return fmt.Errorf("failed to marshal Record, %w", err)
}

_, err = client.PutItem(context.TODO(), &dynamodb.PutItemInput{
    TableName: aws.String(myTableName),
    Item:      av,
})
if err != nil {
    return fmt.Errorf("failed to put Record, %w", err)
}

示例部分取自https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM