Python'da (boto3) DynamoDB'den Tüm Öğeleri Alma
boto3'te bir tablonun tamamını okumak, bir scan'i sonuna kadar sayfalamak demektir. Her yanıt 1 MB'da tavanlanır ve düşük düzeyli istemcinin yerleşik sayfalayıcısı LastEvaluatedKey'i sizin için her sayfa boyunca takip eder (DynamoDB imleçleri nasıl çalışır).
Burada hangi boto3 API'sini seçtiğiniz sayfalamadan daha önemlidir ve sayfalayıcı bunun yalnızca yarısıdır.
Kod
import boto3
client = boto3.client("dynamodb")
paginator = client.get_paginator("scan")
items = []
for page in paginator.paginate(TableName="Music"):
items.extend(page["Items"])
print(f"Table holds {len(items)} items")Açıklama
- Sayfalayıcılar kaynağa değil istemciye aittir —
boto3.resource("dynamodb").Table(…).scan'in hiç sayfalayıcısı yoktur, dolayısıyla oradaLastEvaluatedKeydöngüsünü kendiniz yazarsınız. Tam bir okuma için düşük düzeyli istemciyi kullanmanın tek başına iyi bir gerekçesi budur. - Kaynak API'si sayıları
Decimal'a çevirir — saklanan bir{"N": "1994"}geriDecimal('1994')olarak gelir vejson.dumpsözel bir kodlayıcı olmadan onu serileştirmeyi reddeder. Yukarıdaki istemci size ham{"N": "1994"}'ü verir ve dönüşümü size bırakır (kodlama). - Sayfalayıcıyı değiştirmek yerine ayarlayın —
paginator.paginate(TableName="Music", PaginationConfig={"PageSize": 500, "MaxItems": 10000}). Boto3,PageSize'ı "her sonucun sayfası başına döndürülen öğe sayısı",MaxItems'ı ise toplam üzerinde bir tavan olarak tanımlar; ikincisiStartingTokenile kaldığınız yerden devam ettiğiniz birNextTokenyayar. - Paralel taramalar iş parçacığı başına bir istemciye ihtiyaç duyar ve bunlar dikkatle kurulmalıdır —
SegmentveTotalSegmentsişi böler ve boto3'ün kendi rehberliği, istemcilerin iş parçacığı güvenli, oturum ve kaynakların ise olmadığı yönündedir. Ayrıca "Invokingboto3.client()inside of a concurrent context may result in response ordering issues" uyarısını yapar. İstemciyi dallanmadan önce kurun ya da her işçiye kendiboto3.session.Session()'ını verin (paralel ne zaman değer). itemstablonun boyutuna kadar büyür — tablonun küçük olduğunu zaten bilmiyorsanız, elde tuttuğunuz bir listeyi genişletmek yerine herpage'i döngünün içinde işleyin.- Bir tarama, okuduğu her baytı, her çalıştırmada faturalandırır —
ProjectionExpressionyanıtı küçültür, faturayı değil (nedeni); birFilterExpressionöğeleri okunup ücretlendirildikten sonra eler (filtreli Scan). Sıcak bir yolda istediğiniz şey bir query'dir.
Görsel olarak yapın
Tam bir taramanın faturası, öğe boyutu çarpı öğe sayısıdır ve 4 KB'lık birimlere yuvarlanır. Öğe boyutu hesaplayıcısı, yapıştırılmış bir öğeden bunun öğe başına yarısını verir.
DynoTable ise canlı bir tabloyu sonsuz kaydırmalı bir ızgarada sayfalar ve SQL düzenleyicisi, siz çalıştırmadan önce sorgunuzun derlendiği işlemi adlandırır. RCU tahmini yalnızca tablo meta verileri buna izin verdiğinde görünür. DynoTable'ı indirin.
İlgili örnekler
- Node.js'te tüm öğeleri alma — açık bir döngüyle aynı tam okuma.
- AWS CLI ile tüm öğeleri alma — CLI sizin için sayfalar.
- Python'da DynamoDB Scan — bir
FilterExpressionile tarama. - Paralel taramalar — Segment/TotalSegments, işçi sayıları ve ne zaman uğraşmaya değer.
- DynamoDB Scan'im neden yavaş ve pahalı? — maliyet modeli ve ondan nasıl kaçınılır.
- DynamoDB ProvisionedThroughputExceededException — tablonun tamamını okumak ona çarpmanın klasik yoludur.
- "The provided starting key is invalid" — sayfalama döngüsünde bozulmuş bir devam anahtarı.
Kaynaklar
- Scan — Amazon DynamoDB API Reference
- DynamoDB.Paginator.Scan — Boto3 documentation
- Scanning tables in DynamoDB — Amazon DynamoDB Developer Guide
- DynamoDB read and write operations (capacity unit consumption) — Amazon DynamoDB Developer Guide
- Paginators — Boto3 documentation
- Clients (thread safety) — Boto3 documentation
En son 2026-07-28 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.