我在 dynamodb 中有一個使用以下指令建立的現有表格
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 } } ]' }
我想在它前面放置一個 API 包裝器,它允許我從提供 CustomerId
的表中獲取所有記錄,因此我嘗試使用來自 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>
但是,我從 dynamodb 得到了 400
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
在本機上執行此查詢會傳回我的預期結果
awslocal dynamodb query \ --table-name notifications \ --key-condition-expression "CustomerId = :val" \ --expression-attribute-values '{":val":{"S":"localTesting"}}'
我也嘗試過包含時間戳,但不認為這是必需的,因為我的終端命令沒有它就可以工作。我認為我沒有不當取消引用。我知道我的發電機會話是有效的,因為我可以發佈到我的包裝器並透過終端命令查看更新。
以下是您可以用作範本的查詢範例:
// 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 }
您可以查看更多 GoV2 範例 此處
以上是如何使用 KeyConditionExpression 和 v2 Go SDK 查詢 AWS DynamoDb?的詳細內容。更多資訊請關注PHP中文網其他相關文章!