Ich habe eine vorhandene Tabelle in Dynamodb mit dem folgenden Befehl erstellt
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 } } ]' }
Ich wollte einen API-Wrapper davor platzieren, der es mir ermöglichen würde, alle Datensätze aus der bereitgestellten Tabelle abzurufen CustomerId
, also habe ich versucht, eine Abfrage aus dem v2 GO SDK zu verwenden
<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>
Aber ich habe 400 von Dynamodb bekommen
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
Das lokale Ausführen dieser Abfrage liefert meine erwarteten Ergebnisse
awslocal dynamodb query \ --table-name notifications \ --key-condition-expression "CustomerId = :val" \ --expression-attribute-values '{":val":{"S":"localTesting"}}'
Ich habe auch versucht, den Zeitstempel einzubeziehen, halte ihn aber nicht für notwendig, da meine Terminalbefehle ohne ihn funktionieren. Ich glaube nicht, dass ich unangemessen dereferenziert habe. Ich weiß, dass meine Generatorsitzung gültig ist, weil ich über Terminalbefehle in meinem Wrapper veröffentlichen und Aktualisierungen sehen kann.
Hier sind Beispiele für Abfragen, die Sie als Vorlagen verwenden können:
// 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 }
Weitere GoV2-Beispiele hier
können Sie sich ansehenDas obige ist der detaillierte Inhalt vonWie frage ich AWS DynamoDb mit KeyConditionExpression und v2 Go SDK ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!