我正尝试编写一个非常简单的Go函数来向DynamoDB表中插入条目。
我正在学习AWS文档站点上提供的教程,但是由于某种原因,函数 * dynamodbattribut.MarshalMap * 返回了一个空Map。
代码编译并运行,但在试图插入记录时中断,因为它在map中找不到所需的键。一个小println操作显示map是空的,即使创建它的结构体不是空的。
任何帮助都是感激的!
package main
import (
"context"
"fmt"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-lambda-go/lambda"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/dynamodb"
"github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
)
// Item Struct for Fruit Item
type Item struct {
fruitID int
fruitName string
}
/*HandleRequest handles the lambda request.*/
func HandleRequest(ctx context.Context) (string, error) {
// Initialize a session that the SDK will use to load
// credentials from the shared credentials file ~/.aws/credentials
// and region from the shared configuration file ~/.aws/config.
sess := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
// Create DynamoDB client
svc := dynamodb.New(sess)
item := Item{
fruitID: 2,
fruitName: "Orange",
}
fmt.Println(item)
av, err := dynamodbattribute.MarshalMap(item)
if err != nil {
fmt.Println("Got error marshalling new fruit item: ")
fmt.Println(err.Error())
return "", err
}
fmt.Println("av: ", av)
fmt.Println("ln: ", len(av))
fmt.Println("KEY VALUE PAIRS::")
for key, value := range av {
fmt.Println("Key:", key, "Value:", value)
}
tableName := "fruits"
input := &dynamodb.PutItemInput{
Item: av,
TableName: aws.String(tableName),
}
_, err = svc.PutItem(input)
if err != nil {
fmt.Println("Got error inserting new fruit item: ")
fmt.Println(err.Error())
return "", err
}
return "SUCCESS!", nil
}
func main() {
lambda.Start(HandleRequest)
}
- Lambda的日志输出 *
START RequestId: 82f120d9-6bba-40d9-9204-136d491dbb88 Version: $LATEST
{2 Orange}
av: map[]
ln: 0
KEY VALUE PAIRS::
Got error inserting new fruit item:
ValidationException: One or more parameter values were invalid: Missing the key fruitId in the item
status code: 400, request id: QUJG8R8EHPO65O1JFVI98PRQ1VVV4KQNSO5AEMVJF66Q9ASUAAJG
ValidationException: One or more parameter values were invalid: Missing the key fruitId in the item
status code: 400, request id: QUJG8R8EHPO65O1JFVI98PRQ1VVV4KQNSO5AEMVJF66Q9ASUAAJG: requestError
null
END RequestId: 82f120d9-6bba-40d9-9204-136d491dbb88
2条答案
按热度按时间h7wcgrx31#
结构体中以大写字母开头的字段只能导出,并且可以在此包之外使用。
你能试一下这个结构体,看看它是否有效吗?
s4n0splo2#
为了从结构体导出字段,它们必须以大写字母开头。因此,为了使结构体字段与DynamoDB字段名匹配,您可以执行以下操作:
Marshal函数将使用指定的标签(
fruitID
代替FruitID
等)。我发现使用json
标签对我不起作用,而dynamodbav
起作用。