Maison > Article > développement back-end > Comment interroger AWS DynamoDb à l'aide de KeyConditionExpression et du SDK v2 Go ?
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 } } ]' }
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>
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
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"}}'
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.
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 }
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!