Bagaimana untuk menanyakan AWS DynamoDb menggunakan KeyConditionExpression dan v2 Go SDK?

WBOY
Lepaskan: 2024-02-08 20:48:04
ke hadapan
631 orang telah melayarinya

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

Kandungan soalan

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
          }
      }
  ]'
}
Salin selepas log masuk

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>
Salin selepas log masuk

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
Salin selepas log masuk

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"}}'
Salin selepas log masuk

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.


Jawapan Betul


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
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!