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 25

in.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 ve Year'ı bir Go int'ine çevirir; eşlemeyi dynamodbav struct etiketleri denetler.
  • Sayılar hat üzerinde dizedir. Ham değer &types.AttributeValueMemberN{Value: "2010"}'dur — N üyesi bir Go string'i tutar; dolayısıyla tipli bir struct'a unmarshal etmediğiniz sürece strconv her aritmetiğin iki yanında oturur.
  • FilterExpression okumadan 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.
  • #filter0 biçimsel değil, zorunludur. Year bir DynamoDB ayrılmış sözcüğüdür; takma adsız kullanıldığında ValidationException: Invalid FilterExpression: Attribute name is a reserved keyword; reserved keyword: Year döndürür.
  • Segment / TotalSegments her 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

Kaynaklar

Bu isteği görsel olarak oluştur

Bu operasyonu ücretsiz DynamoDB Sorgu Oluşturucuda kur — anahtar koşulu, filtre, index, Limit, sıralama yönü ve bir sayfalama döngüsü — ve çalıştırılabilir bir SDK v3, CLI veya boto3 programı olarak geri kopyala.

DynamoDB Sorgu Oluşturucuyu aç

Console olmadan DynamoDB ile çalış

DynamoDB’nin çalıştıramadığı gerçek SQL’i çalıştıran hızlı bir DynamoDB masaüstü istemcisi — JOINs, GROUP BY, toplamalar — görsel düzenleme ve kendi Bedrock anahtarların üzerinde bir yapay zekâ aracısıyla.

30 günlük ücretsiz deneme, kredi kartı yok — ardından süre sınırı olmayan Ücretsiz plan.