Go'da DynamoDB Scan (AWS SDK v2)
NewScanPaginator bir koleksiyon değil, bir imleçtir: iyimser başlar, tükenmiş biter ve sayfa boyutunu önünüzdeki ScanInput'un göstermediği bir yerden alır. Scan'den tümüyle ne zaman kaçınmanız gerektiği için bkz. Query ile Scan.
Kod
package main
import (
"context"
"fmt"
"log"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)
func main() {
ctx := context.TODO()
cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("us-east-1"))
if err != nil {
log.Fatalf("load config: %v", err)
}
client := dynamodb.NewFromConfig(cfg)
paginator := dynamodb.NewScanPaginator(client, &dynamodb.ScanInput{
TableName: aws.String("Music"),
FilterExpression: aws.String("#filter0 >= :filterValue0"),
ExpressionAttributeNames: map[string]string{
"#filter0": "Year",
},
ExpressionAttributeValues: map[string]types.AttributeValue{
":filterValue0": &types.AttributeValueMemberN{Value: "2010"},
},
})
var items []map[string]types.AttributeValue
for paginator.HasMorePages() {
page, err := paginator.NextPage(ctx)
if err != nil {
log.Fatalf("scan: %v", err)
}
items = append(items, page.Items...)
}
fmt.Printf("Matched %d items\n", len(items))
}HasMorePages() gerçekte ne döndürür
Yaklaşık 3,9 KB'lık öğelerden oluşan 600 şarkılık bir düzeneğe karşı — bunlardan 8'i Year >= 2010 ile eşleşiyor ve en sona sıralanıyor:
fresh HasMorePages(): true (before any request)
page 1: len(page.Items)=0 ScannedCount=271 CU=128.5 LastEvaluatedKey set
page 2: len(page.Items)=0 ScannedCount=271 CU=128.5 LastEvaluatedKey set
page 3: len(page.Items)=8 ScannedCount= 58 CU= 27.5 LastEvaluatedKey nil
exhausted HasMorePages(): false
NextPage() after exhaustion: err = "no more pages available"HasMorePages() ilk çağrıdan önce true'dur; dolayısıyla döngü her zaman en az bir kez ateşlenir. Onu bir tablonun boş olup olmadığını sınamak için kullanamazsınız. Sonra tarama hâlâ sürerken iki sayfa sıfır öğe döndürdü; bu da if len(page.Items) == 0 { break } ifadesinin 8 eşleşme tutan bir tabloda boş sonuç bildirmesi demektir. Ve sayfalayıcı tek kullanımlıktır: döngüden sonra değer tükenmiştir ve NextPage yeniden başlamak yerine bir hata döndürür. Yeniden taramak, NewScanPaginator'ı yeniden çağırmak demektir.
Limit iki yerde yaşar ve seçenek kazanır
Go, sayfa boyutunu girdi struct'ı ile sayfalayıcının kendi seçenekleri arasında böler. İkisini de ayarlayın; seçenek öncelik alır:
ScanInput.Limit = 500, ScanPaginatorOptions.Limit = 25 -> ScannedCount 25in.Limit = aws.Int32(500) atayıp 500 öğelik sayfalar beklemek, başka bir yerdeki işlevsel bir seçenek zaten 25 ayarlamışsa sessiz bir ıskadır. Yalnızca ScanInput'a dokunuyorsanız sayfalayıcı ona uyar.
2026-07-28 tarihinde go1.26.5 üzerinde aws-sdk-go-v2/service/dynamodb v1.62.1 ile, DynamoDB Local'e (amazon/dynamodb-local) karşı ölçüldü.
Açıklama
page.Items, struct'ınız değil[]map[string]types.AttributeValue'dur.attributevalue.UnmarshalListOfMaps(items, &songs)yığını tek çağrıda dönüştürür veYear'ı bir Goint'ine çevirir; eşlemeyidynamodbavstruct etiketleri denetler.- Sayılar hat üzerinde dizedir. Ham değer
&types.AttributeValueMemberN{Value: "2010"}'dur —Nüyesi bir Gostring'i tutar; dolayısıyla tipli bir struct'a unmarshal etmediğiniz sürecestrconvher aritmetiğin iki yanında oturur. FilterExpressionokumadan sonra çalışır; iki boş sayfanın yine de her biri 128,5 birime mal olmasının nedeni budur. API başvurusu, filtrelemenin "does not consume any additional read capacity units" olduğunu açıkça söyler ve bunun doğal sonucu da hiç tasarruf sağlamadığıdır.#filter0biçimsel değil, zorunludur.Yearbir DynamoDB ayrılmış sözcüğüdür; takma adsız kullanıldığındaValidationException: Invalid FilterExpression: Attribute name is a reserved keyword; reserved keyword: Yeardöndürür.Segment/TotalSegmentsher goroutine'e tablonun kendi dilimini verir ve her birinin kendi sayfalayıcısı gerekir. Paralellik duvar saatini kısaltır ve aynı kapasiteyi harcar.
Görsel olarak yapın
DynamoDB sorgu oluşturucu, program şeklinin tamamını — filtre, ad ve değer eşlemeleri ve sayfalayıcı döngüsü — yayar; böylece bu sayfanın ölçtüğü parçalar hatırlanmak yerine üretilir.
Taramayı bir hizmete bağlamadan önce bir filtrenin gerçekte kaç öğeye dokunduğunu görmek için DynoTable'ı indirin ve onu tabloya karşı bir ızgarada çalıştırın.
İlgili örnekler
- Java'da DynamoDB Scan — AWS SDK for Java 2.x ile aynı tarama.
- Go'da DynamoDB Query — genellikle başvurmanız gereken daha ucuz okuma.
- Query ile Scan — bir
Scanne zaman (nadiren) haklı çıkar. - DynamoDB Scan'im neden yavaş ve pahalı? — maliyet modeli ve ondan nasıl kaçınılır.
- DynamoDB ProvisionedThroughputExceededException — tam tablo taramasının sağlanan bir tablonun kapasitesine yaptığı şey.
- DynamoDB ThrottlingException — diğer kısıtlama ve üstel geri çekilmenin onu nasıl ele aldığı.