我正尝试使用aws-sdk-go设置一个AWS-lambda,每当向某个dynamodb表添加新的user
时,就会触发这个AWS-lambda。
一切都很好,但我找不到一种方法来解组Mapmap[string]DynamoDBAttributeValue
如下:
{
"name": {
"S" : "John"
},
"residence_address": {
"M": {
"address": {
"S": "some place"
}
}
}
}
到一个给定的结构体,例如,一个User
结构体。这里显示了一个将map[string]*dynamodb.AttributeValue
反序列化到一个给定接口的例子,但是我找不到一种方法来对map[string]DynamoDBAttributeValue
做同样的事情,即使这些类型看起来适合相同的目的。map[string]DynamoDBAttributeValue
由events.DynamoDBEvents
从包github.com/aws/aws-lambda-go/events
返回。这是我的代码:
package handler
import (
"context"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
"github.com/aws/aws-sdk-go/service/dynamodb"
)
func HandleDynamoDBRequest(ctx context.Context, e events.DynamoDBEvent) {
for _, record := range e.Records {
if record.EventName == "INSERT" {
// User Struct
var dynamoUser model.DynamoDBUser
// Of course this can't be done for incompatible types
_ := dynamodbattribute.UnmarshalMap(record.Change.NewImage, &dynamoUser)
}
}
}
当然,我可以将record.Change.NewImage
编组为JSON,然后将其解编组回给定的结构体,但是,我必须从后面的属性开始手动初始化dynamoUser
属性。
或者,我甚至可以编写一个函数,将map[string]DynamoDBAttributeValue
解析为map[string]*dynamodb.AttributeValue
,如下所示:
func getAttributeValueMapFromDynamoDBStreamRecord(e events.DynamoDBStreamRecord) map[string]*dynamodb.AttributeValue {
image := e.NewImage
m := make(map[string]*dynamodb.AttributeValue)
for k, v := range image {
if v.DataType() == events.DataTypeString {
s := v.String()
m[k] = &dynamodb.AttributeValue{
S : &s,
}
}
if v.DataType() == events.DataTypeBoolean {
b := v.Boolean()
m[k] = &dynamodb.AttributeValue{
BOOL : &b,
}
}
// . . .
if v.DataType() == events.DataTypeMap {
// ?
}
}
return m
}
然后简单地使用dynamodbattribute.UnmarshalMap
,但在events.DataTypeMap
上,这将是一个相当棘手的过程。
是否有一种方法可以使用与map[string]*dynamodb.AttributeValue
类似的方法将来自events.DynamoDBEvent
的DynamoDB记录解组到结构体中?
3条答案
按热度按时间5kgi1eie1#
我尝试了您提供的函数,但遇到了一些
events.DataTypeList
的问题,因此我设法编写了以下函数来完成此任务:2exbekwf2#
令我沮丧的是,记录中NewImage的类型不是map[string]* dynamodb.AttributeValue,因此我可以使用dynamodbattribute包。
事件.DynamoDBAttributeValue的JSON表示似乎与dynamodb.AttributeValue的JSON表示相同。
所以我尝试创建自己的DynamoDBEvent类型,并更改OldImage和NewImage的类型,以便将其编组为map[string]*dynamodb.AttributeValue,而不是map[string]事件。
它是有点难看,但它对我很有效。
ccrfmcuu3#
我也发现了同样的问题,解决方法是进行一个简单的类型转换,这是可能的,因为最终lambda事件
events.DynamoDBAttributeValue
接收到的类型和AWS DynamoDBtypes.AttributeValue
的SDK V2使用的类型是一样的,下面我给大家展示转换代码。