Go'da DynamoDB Scan (AWS SDK v2)
Scan, bir tablo veya indekteki her öğeyi sayfa sayfa okur, ardından isteğe bağlı olarak bir FilterExpression ile satırları eler. Go v2 için AWS SDK'da yerleşik ScanPaginator, tablonun tamamı okunana kadar LastEvaluatedKey'i takip eder.
Code
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))
}Açıklama
FilterExpression— okumadan sonra, sunucuda uygulanır. Yanıtı küçültür ama maliyeti değil: filtrelenmiş olsun ya da olmasın, taranan her öğeyi okumak için ödeme yaparsınız.ExpressionAttributeNames— filtrelenen öznitelik bir takma ad alır (#filter0→Year); bu daYeargibi ayrılmış sözcükleri güvende tutar.- Sayfalama — her
Scansayfası filtrelemeden önce en fazla 1 MB okur; bu nedenle tabloda hâlâ eşleşmeler varken filtrelenmiş bir sayfa boş dönebilir.dynamodb.NewScanPaginator,LastEvaluatedKeytükenene kadar çağırmaya devam eder — asla ilk sayfada durmayın. - Sayfa başına (filtreleme öncesi) taranan öğeleri sınırlamak için
Limitayarlayın — döndürülen öğeleri sınırlamaz. - Büyük bir tam tablo taraması için
Segment/TotalSegments(bir paralel tarama) ile işi goroutine'lere bölün. Query'yi tercih edin.Scantablonun tamamını okur; çok küçük bir tablo dışında her şeyde yavaş ve pahalıdır.
Görsel olarak yapın
Bir filtreyi elle mi oluşturuyorsunuz? DynamoDB Expression Builder, FilterExpression + ad/değer eşlemelerini oluşturur ve çalıştırılabilir kodu kopyalar.
Bir betikten körlemesine taramak yerine tabloları bir grafik arayüzde (GUI) keşfetmek için — filtrelenmiş, sayfalanmış sonuç ızgaraları ve kod olarak kopyalama — DynoTable'ı indirin.
İlgili örnekler
- Java'da DynamoDB Scan — Java 2.x için AWS SDK ile aynı tarama.
- Go'da DynamoDB Query — genellikle başvurmanız gereken daha ucuz okuma.
- Query ve Scan — bir
Scan'in (nadiren) ne zaman haklı olduğu. - DynamoDB Scan'im neden yavaş ve pahalı? — maliyet modeli ve bundan nasıl kaçınılacağı.
- DynamoDB ProvisionedThroughputExceededException — bir tam tablo taramasının, sağlanan bir tablonun kapasitesine ne yaptığı.
- DynamoDB ThrottlingException — diğer kısıtlama ve üstel geri çekilmenin bunu nasıl ele aldığı.
References
- Scan — Amazon DynamoDB API Reference
- Use Scan with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- dynamodb package — AWS SDK for Go v2 (pkg.go.dev)
- dynamodb/types package — AWS SDK for Go v2 (pkg.go.dev)
- Scanning tables — Amazon DynamoDB Developer Guide
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.