我正在嘗試為我擁有的 dynamodb 表創建一個分頁端點。但是我已經嘗試了所有方法來讓exclusiveStartKey 成為它作業的正確型別。但是,我嘗試過的所有方法似乎都不起作用。
示例代碼:
func GetPaginator(tableName string, limit int32, lastEvaluatedKey string) (*dynamodb.ScanPaginator, error) {
svc, err := GetClient()
if err != nil {
logrus.Error(err)
return nil, err
}
input := &dynamodb.ScanInput{
TableName: aws.String(tableName),
Limit: aws.Int32(limit),
}
if lastEvaluatedKey != "" {
input.ExclusiveStartKey = map[string]types.AttributeValue{
"id": &types.AttributeValueMemberS{
Value: lastEvaluatedKey,
},
}
}
paginator := dynamodb.NewScanPaginator(svc, input)
return paginator, nil
}
編輯:
好的,所以我正在創建一個需要分頁的 API。API 需要有一個查詢引數,可以在其中定義 lastEvaluatedId。然后我可以使用 lastEvaluatedId 作為 ScanInput 上的 ExclusiveStartKey 傳遞。但是,當我這樣做時,我仍然從資料庫中收到了相同的專案。我已經創建了一個 test.go 檔案,并將在下面發布代碼:
package main
import (
"context"
"fmt"
"os"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
)
type PaginateID struct {
ID string `dynamodbav:"id" json:"id"`
}
func main() {
lastKey := PaginateID{ID: "ae82a99d-486e-11ec-a7a7-0242ac110002"}
key, err := attributevalue.MarshalMap(lastKey)
if err != nil {
fmt.Println(err)
return
}
cfg, err := config.LoadDefaultConfig(context.TODO(), func(o *config.LoadOptions) error {
o.Region = os.Getenv("REGION")
return nil
})
if err != nil {
fmt.Println(err)
return
}
svc := dynamodb.NewFromConfig(cfg, func(o *dynamodb.Options) {
o.EndpointResolver = dynamodb.EndpointResolverFromURL("http://localhost:8000")
})
input := &dynamodb.ScanInput{
TableName: aws.String("TABLE_NAME"),
Limit: aws.Int32(1),
ExclusiveStartKey: key,
}
paginator := dynamodb.NewScanPaginator(svc, input)
if paginator.HasMorePages() {
data, err := paginator.NextPage(context.TODO())
if err != nil {
fmt.Println(err)
return
}
fmt.Println(data.Items[0]["id"])
fmt.Println(data.LastEvaluatedKey["id"])
}
}
當我運行此測驗代碼時。我得到這個輸出:
&{ae82a99d-486e-11ec-a7a7-0242ac110002 {}}
&{ae82a99d-486e-11ec-a7a7-0242ac110002 {}}
So the item that is returned is the same Id that I am passing to the ScanInput.ExclusiveStartKey. Which means it's not starting from the ExclusiveStartKey. The scan is starting from the beginning everytime.
uj5u.com熱心網友回復:
該aws-sdk-go-v2DynamoDB查詢和掃描分頁程式的建構式有一個bug(見我的github上的問題,包括修復)。他們不尊重 ExclusiveStartKey 引數。
作為臨時修復,我在本地復制了分頁器型別并在建構式中添加了一行: nextToken: params.ExclusiveStartKey.
uj5u.com熱心網友回復:
所以基本上你需要做的是獲取 LastEvaluatedKey并將其傳遞給ExclusiveStartKey
您不能使用掃描分頁器屬性,因為它不是匯出屬性,因此我建議您通過呼叫NextPage 來使用回傳的頁面
在以下代碼段中,我有一個示例:
func GetPaginator(ctx context.Context,tableName string, limit int32, lastEvaluatedKey map[string]types.AttributeValue) (*dynamodb.ScanOutput, error) {
svc, err := GetClient()
if err != nil {
logrus.Error(err)
return nil, err
}
input := &dynamodb.ScanInput{
TableName: aws.String(tableName),
Limit: aws.Int32(limit),
}
if len(lastEvaluatedKey) > 0 {
input.ExclusiveStartKey = lastEvaluatedKey
}
paginator := dynamodb.NewScanPaginator(svc, input)
return paginator.NextPage(), nil
}
請記住,這paginator.NextPage(ctx)可能是nil因為沒有更多頁面,或者您可以使用HasMorePages()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/360535.html
標籤:amazon-web-services go amazon-dynamodb aws-sdk-go aws-sdk-go-v2
上一篇:亞馬遜s3.upload需要時間
