Heim  >  Artikel  >  Backend-Entwicklung  >  Wie frage ich AWS DynamoDb mit KeyConditionExpression und v2 Go SDK ab?

Wie frage ich AWS DynamoDb mit KeyConditionExpression und v2 Go SDK ab?

WBOY
WBOYnach vorne
2024-02-08 20:48:04611Durchsuche

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

Frageninhalt

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.


Richtige Antwort


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 ansehen

Das 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen