Home  >  Article  >  Backend Development  >  How to correctly unmarshal the results of a PartiQL query in Go using the AWS sdk?

How to correctly unmarshal the results of a PartiQL query in Go using the AWS sdk?

WBOY
WBOYforward
2024-02-12 16:12:12490browse

如何使用 AWS sdk 在 Go 中正确解组 PartiQL 查询的结果?

Question content

My band's upcoming shows are stored in DynamoDB and I have the following code:

type PartiQLRunner struct {
    DynamoDbClient *dynamodb.DynamoDB
    TableName      string
}

func BuildRunner() *PartiQLRunner {
    sess := session.Must(session.NewSessionWithOptions(session.Options{
        SharedConfigState: session.SharedConfigEnable,
    }))

    svc := dynamodb.New(sess)

    return &PartiQLRunner{
        DynamoDbClient: svc,
        TableName:      "SHOWS",
    }
}

type Show struct {
    PK      int    `dynamodbav:"PK"`
    DATE    string `dynamodbav:"DATE"`
    ADDRESS string `dynamodbav:"ADDRESS"`
    VENUE   string `dynamodbav:"VENUE"`
}

func (runner PartiQLRunner) GetShows() ([]Show, error) {
    var shows []Show
    response, err := runner.DynamoDbClient.ExecuteStatement(
        &dynamodb.ExecuteStatementInput{
            Statement: aws.String(fmt.Sprintf("SELECT * FROM \"%v\" WHERE PK = 1", runner.TableName)),
        })
    if err != nil {
        log.Printf("Couldn't get info. Here's why: %v\n", err)
    } else {
        err = attributevalue.UnmarshalListOfMaps(response.Items, &shows)
        if err != nil {
            log.Printf("Couldn't unmarshal response. Here's why: %v\n", err)
        }
    }
    return shows, err
}

However, I get the following error in the response.Items parameter in UnmarshalListOfMaps():

Cannot use "response.Items" (type []map[string]*AttributeValue) as type []map[string]types.AttributeValue

I'm still a little new to Go syntax and I'm not sure I understand the mismatch between what's passed in and what's expected. Any help would be greatly appreciated.

Workaround

It seems that there is a type mismatch between what the UnmarshalListOfMaps function expects and what you provide. The error message indicates that the function requires an argument of type []map[string]types.AttributeValue, but response.Items is of type []map[string]*AttributeValue .

The solution is to convert response.Items to the correct type or use the correct type signature for your slice.

The solution to this problem is as follows:

package main

import (
    "fmt"
    "log"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb/attributevalue"
    "github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)

type Show struct {
    PK      int    `dynamodbav:"PK"`
    DATE    string `dynamodbav:"DATE"`
    ADDRESS string `dynamodbav:"ADDRESS"`
    VENUE   string `dynamodbav:"VENUE"`
}

type PartiQLRunner struct {
    DynamoDbClient *dynamodb.Client
    TableName      string
}

func (runner PartiQLRunner) GetShows() ([]*Show, error) {
    var shows []*Show

    response, err := runner.DynamoDbClient.ExecuteStatement(
        &dynamodb.ExecuteStatementInput{
            Statement: aws.String(fmt.Sprintf("SELECT * FROM \"%v\" WHERE PK = 1", runner.TableName)),
        })
    if err != nil {
        log.Printf("Couldn't get info. Here's why: %v\n", err)
        return shows, err
    }

    err = attributevalue.UnmarshalListOfMaps(response.Items, &shows)
    if err != nil {
        log.Printf("Couldn't unmarshal response. Here's why: %v\n", err)
        return shows, err
    }

    return shows, nil
}

// The main function is just for demonstration and may not be part of your code
func main() {
    // You will need to initialize your DynamoDbClient and TableName
    runner := PartiQLRunner{
        DynamoDbClient: /* initialize your DynamoDB client here */,
        TableName:      "YourTableName",
    }

    shows, err := runner.GetShows()
    if err != nil {
        log.Fatalf("Error retrieving shows: %v", err)
    }

    for _, show := range shows {
        fmt.Printf("Show Date: %s, Venue: %s, Address: %s\n", show.DATE, show.VENUE, show.ADDRESS)
    }
}

Make sure you have the appropriate DynamoDB client initialization logic (commented out in the main function) to establish the connection to DynamoDB.

The provided code now correctly unmarshals the response into fragments of pointers to Show structures.

The above is the detailed content of How to correctly unmarshal the results of a PartiQL query in Go using the AWS sdk?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete