Saya mempunyai jadual sedia ada dalam dynamodb yang dibuat menggunakan arahan berikut
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 } } ]' }
Saya mahu meletakkan pembungkus API di hadapannya yang membolehkan saya mendapatkan semua rekod daripada jadual yang disediakan CustomerId
jadi saya cuba menggunakan pertanyaan daripada v2 GO SDK
<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>
Tetapi, saya dapat 400 daripada 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
Menjalankan pertanyaan ini secara tempatan mengembalikan hasil jangkaan saya
awslocal dynamodb query \ --table-name notifications \ --key-condition-expression "CustomerId = :val" \ --expression-attribute-values '{":val":{"S":"localTesting"}}'
Saya juga cuba memasukkan cap waktu tetapi tidak fikir ia perlu kerana arahan terminal saya berfungsi tanpanya. Saya tidak fikir saya menyahrujuk secara tidak wajar. Saya tahu sesi penjana saya sah kerana saya boleh menerbitkan ke pembungkus saya dan melihat kemas kini melalui arahan terminal.
Berikut adalah contoh pertanyaan yang boleh anda gunakan sebagai templat:
// 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 }
Anda boleh melihat lebih banyak contoh GoV2 di sini
Atas ialah kandungan terperinci Bagaimana untuk menanyakan AWS DynamoDb menggunakan KeyConditionExpression dan v2 Go SDK?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!