Maison > développement back-end > Golang > Comment interroger AWS DynamoDb à l'aide de KeyConditionExpression et du SDK v2 Go ?

Comment interroger AWS DynamoDb à l'aide de KeyConditionExpression et du SDK v2 Go ?

WBOY
Libérer: 2024-02-08 20:48:04
avant
697 Les gens l'ont consulté

如何使用 KeyConditionExpression 和 v2 Go SDK 查询 AWS DynamoDb?

Contenu de la question

J'ai une table existante dans dynamodb créée à l'aide de la commande suivante

aws dynamodb create-table \
  --region us-east-1 \
  --table-name notifications \
  --attribute-definitions AttributeName=CustomerId,AttributeType=S AttributeName=Timestamp,AttributeType=N AttributeName=MessageId,AttributeType=S \
  --key-schema AttributeName=CustomerId,KeyType=HASH AttributeName=Timestamp,KeyType=RANGE \
  --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
  --global-secondary-indexes '[
      {
          "IndexName": "MessageId",
          "KeySchema": [
              {
                  "AttributeName": "MessageId",
                  "KeyType": "HASH"
              }
          ],
          "Projection": {
              "ProjectionType": "ALL"
          },
          "ProvisionedThroughput": {
              "ReadCapacityUnits": 5,
              "WriteCapacityUnits": 5
          }
      }
  ]'
}
Copier après la connexion

Je voulais mettre un wrapper API devant celui-ci qui me permettrait d'obtenir tous les enregistrements de la table fournie CustomerId j'ai donc essayé d'utiliser une requête du SDK GO v2

<code>// GET /notifications/
func (api NotificationsApi) getNotifications(w http.ResponseWriter, r *http.Request) {
    var err error

    customerId := r.URL.Query().Get("customerId")
    if customerId == "" {
        api.errorResponse(w, "customerId query parameter required", http.StatusBadRequest)
        return
    }
    span, ctx := tracer.StartSpanFromContext(r.Context(), "notification.get")
    defer span.Finish(tracer.WithError(err))

    keyCond := expression.Key("CustomerId").Equal(expression.Value(":val"))
    expr, err := expression.NewBuilder().WithKeyCondition(keyCond).Build()

    input := &dynamodb.QueryInput{
        TableName:              aws.String("notifications"),
        KeyConditionExpression: expr.KeyCondition(),
        ExpressionAttributeValues: map[string]dynamodbTypes.AttributeValue{
            ":val": &dynamodbTypes.AttributeValueMemberS{Value: customerId},
        },
    }

    fmt.Println(*expr.KeyCondition())
    output, err := api.dynamoClient.Query(ctx, input)

    fmt.Println(output)
    fmt.Println(err)
}
</code>
Copier après la connexion

Mais j'en ai reçu 400 de dynamodb

operation error DynamoDB: Query, https response error StatusCode: 400, RequestID: *****, api error ValidationException: Invalid KeyConditionExpression: An expression attribute name used in the document path is not defined; attribute name: #0
Copier après la connexion

fmt.PrintLn(*expr.KeyCondition()) 的输出是 #0 = :0

L'exécution de cette requête localement renvoie les résultats attendus

awslocal dynamodb query \
    --table-name notifications \
    --key-condition-expression "CustomerId = :val" \
    --expression-attribute-values '{":val":{"S":"localTesting"}}'
Copier après la connexion

J'ai également essayé d'inclure l'horodatage mais je ne pense pas que ce soit nécessaire car mes commandes de terminal fonctionnent sans lui. Je ne pense pas avoir déréférencé de manière inappropriée. Je sais que ma session de générateur est valide car je peux publier sur mon wrapper et voir les mises à jour via les commandes du terminal.


Bonne réponse


Voici des exemples de requêtes que vous pouvez utiliser comme modèles :

// TableBasics encapsulates the Amazon DynamoDB service actions used in the examples.
// It contains a DynamoDB service client that is used to act on the specified table.
type TableBasics struct {
    DynamoDbClient *dynamodb.Client
    TableName      string
}



// Query gets all movies in the DynamoDB table that were released in the specified year.
// The function uses the `expression` package to build the key condition expression
// that is used in the query.
func (basics TableBasics) Query(releaseYear int) ([]Movie, error) {
    var err error
    var response *dynamodb.QueryOutput
    var movies []Movie
    keyEx := expression.Key("year").Equal(expression.Value(releaseYear))
    expr, err := expression.NewBuilder().WithKeyCondition(keyEx).Build()
    if err != nil {
        log.Printf("Couldn't build expression for query. Here's why: %v\n", err)
    } else {
        response, err = basics.DynamoDbClient.Query(context.TODO(), &dynamodb.QueryInput{
            TableName:                 aws.String(basics.TableName),
            ExpressionAttributeNames:  expr.Names(),
            ExpressionAttributeValues: expr.Values(),
            KeyConditionExpression:    expr.KeyCondition(),
        })
        if err != nil {
            log.Printf("Couldn't query for movies released in %v. Here's why: %v\n", releaseYear, err)
        } else {
            err = attributevalue.UnmarshalListOfMaps(response.Items, &movies)
            if err != nil {
                log.Printf("Couldn't unmarshal query response. Here's why: %v\n", err)
            }
        }
    }
    return movies, err
}
Copier après la connexion

Vous pouvez voir plus d'exemples GoV2 ici

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal