登录
首页 >  Golang >  Go问答

使用 GO Lambda 处理 DynamoDB 项目

来源:stackoverflow

时间:2024-02-08 19:54:22 342浏览 收藏

从现在开始,努力学习吧!本文《使用 GO Lambda 处理 DynamoDB 项目》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

问题内容

我正在执行简单的表扫描,以获取 dynamodb 表 products 中的所有项目。这是整个 lambda:

package main

import (
    "context"
    "fmt"

    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb"
)

type product struct {
    productuuid string
    name        string
    description string
    brand       string
    price       string
    category    string
    dateadded   string
}

func handlerequest() (string, error) {
    cfg, err := config.loaddefaultconfig(context.todo(), func(o *config.loadoptions) error {
        o.region = "us-east-2"
        return nil
    })

    if err != nil {
        panic(err)
    }

    svc := dynamodb.newfromconfig(cfg)

    out, err := svc.scan(context.todo(), &dynamodb.scaninput{
        tablename: aws.string("products"),
    })

    if err != nil {
        panic(err)
    }

    for _, item := range out.items {
        fmt.println(item)
    }

    return "items", nil // temporary debugging return (always 200). i'd like to return a json object here
}

func main() {
    lambda.start(handlerequest)
}

当我取回数据时,我可以按以下形式打印出每一项:

map[brand:0xc0002f38a8 category:0xc0002f3848 dateAdded:0xc0002f3830 name:0xc0002f3800 price:0xc0002f37a0 productUUID:0xc0002f3818]

如何将这些 items 转换为我上面定义的结构,然后返回 lambda 期望的 json 响应(基本上是 http 响应代码和 json 形式的 items)?


正确答案


扫描表返回项目映射,并且您想要将映射转换为结构,因此为了将映射列表转换为您想要在 aws-sdk-go-v2 下使用 attributevalue.UnmarshalListOfMaps 的结构。在以前的版本中,它位于 dynamodbattribute 中,但是他们决定更改 v2 中的软件包。

products := []product{}
err = attributevalue.unmarshallistofmaps(out.items, &products)
if err != nil {
    panic(fmt.sprintf("failed to unmarshal dynamodb scan items, %v", err))
}

productsjson, err := json.marshal(products)
if err != nil {
    panic(err)
}

我在 product 结构中看到的一个问题是,您需要使用导出的名称,并且还需要为结构字段定义 json 标签,否则数据将不会被解组到结构中。因此,为了将表中的扫描项返回到 json 响应中,您的代码应如下所示。

package main

import (
    "context"
    "encoding/json"
    "fmt"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb"
)

type Product struct {
    ProductUUID string `json:"productUUID"`
    Name        string `json:"name"`
    Description string `json:"description"`
    Brand       string `json:"brand"`
    Price       string `json:"price"`
    Category    string `json:"category"`
    DateAdded   string `json:"dateAdded"`
}

func handleRequest() (events.APIGatewayProxyResponse, error) {
    products := []Product{}
    cfg, err := config.LoadDefaultConfig(context.TODO(), func(o *config.LoadOptions) error {
        o.Region = "us-east-2"
        return nil
    })

    if err != nil {
        panic(err)
    }
    svc := dynamodb.NewFromConfig(cfg)

    out, err := svc.Scan(context.TODO(), &dynamodb.ScanInput{
        TableName: aws.String("products"),
    })

    if err != nil {
        panic(err)
    }

    err = attributevalue.UnmarshalListOfMaps(out.Items, &products)
    if err != nil {
        panic(fmt.Sprintf("failed to unmarshal Dynamodb Scan Items, %v", err))
    }

    productsJson, err := json.Marshal(products)
    if err != nil {
        panic(err)
    }

    resp := events.APIGatewayProxyResponse{
        StatusCode:      200,
        IsBase64Encoded: false,
        Body:            string(productsJson),
        Headers: map[string]string{
            "Content-Type": "application/json",
        },
    }

    return resp, nil
}

func main() {
    lambda.Start(handleRequest)
}

附注: 扫描整个发电机表并将其作为响应返回的成本非常高,您应该避免它。

本篇关于《使用 GO Lambda 处理 DynamoDB 项目》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>