首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GO Lambda中处理DynamoDB项

在GO Lambda中处理DynamoDB项
EN

Stack Overflow用户
提问于 2022-04-03 15:41:24
回答 1查看 301关注 0票数 1

我正在执行一个简单的表扫描,以从我的DynamoDB表products中获取所有项目。这是整个兰博达:

代码语言:javascript
复制
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)
}

当我拿回数据后,我可以用以下形式打印出每一项:

代码语言:javascript
复制
map[brand:0xc0002f38a8 category:0xc0002f3848 dateAdded:0xc0002f3830 name:0xc0002f3800 price:0xc0002f37a0 productUUID:0xc0002f3818]

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-03 18:22:57

扫描表将返回项的映射,并且希望将映射转换为结构,因此,为了将映射列表转换为要在aws-sdk-go-v2下使用的结构,您需要使用aws-sdk-go-v2。在以前的版本中,它在动力属性中,但是他们决定更改v2中的包。

代码语言:javascript
复制
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中看到的一个问题是,您需要使用导出的名称,还需要为struct字段定义json标记,否则就不会将数据解组到结构中。因此,为了将扫描项从表返回到json响应中,您的代码应该如下所示。

代码语言:javascript
复制
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)
}

P.S:扫描整个发电机表并将其作为响应返回非常昂贵,您应该避免它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71727437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档