Python (boto3) ile DynamoDB Scan
boto3'te bir scan iki karardır: istek ve onu nasıl sayfaladığınız. Aşağıdaki parçacık, birinin sizin döngünüzün etrafına yazdığı bir sarmalayıcı olmayan yerleşik sayfalayıcıyı kullanır. O, beş satırlık botocore yapılandırmasıdır ve bu beş satır, taramanızın doğru olup olmadığına ve neye mal olduğuna karar verir. (Hiç taramanız gerekip gerekmediği ayrı bir sorudur.)
Kod
import boto3
client = boto3.client("dynamodb")
paginator = client.get_paginator("scan")
items = []
for page in paginator.paginate(
TableName="Music",
FilterExpression="#filter0 >= :filterValue0",
ExpressionAttributeNames={"#filter0": "Year"},
ExpressionAttributeValues={":filterValue0": {"N": "2010"}},
):
items.extend(page["Items"])
print(f"Matched {len(items)} items")Açıklama
- Sayfalayıcı koddur değil, veridir. botocore,
paginators-1.jsoniçinde işlem başına bir girdi sunar;Scan'inki şöyle okunur:{"input_token": "ExclusiveStartKey", "output_token": "LastEvaluatedKey", "limit_key": "Limit", "result_key": ["Items", "Count", "ScannedCount"], "non_aggregate_keys": ["ConsumedCapacity"]}. Aşağıdaki her şey bu anahtarlardan çıkar. PaginationConfig={"PageSize": n},Limit'i ayarlar, çünküLimitlimit_key'dir.Limit, okunan öğeleri sınırlar, asla döndürülen öğeleri değil; dolayısıyla birFilterExpressionile bir sayfa boş olabilir ve yine de maliyeti olur.MaxItems,result_keyöğelerini sayar ve size daha sonraki bir süreçteStartingTokenolarak geçirebileceğiniz birNextTokenverir. İsteğin kesme noktanızın ötesini okumasını durdurmaz.build_full_result()yalnızcaresult_keyalanlarını toplar.Items,CountveScannedCounttoplanır;ConsumedCapacitybirnon_aggregate_key'dir, dolayısıyla birleştirilmiş sonuç tek bir sayfanın kapasitesini sanki taramanın tamamıymış gibi bildirir. Onu sayfa başına kendiniz toplayın; yoksa sayfa sayısı katı kadar eksik bildirirsiniz.FilterExpressionsunucu tarafında okumadan sonra çalışır, dolayısıylaCountüzerinden değilScannedCountüzerinden faturalandırılırsınız.#filter0,Year'ı takma adlandırır çünkü o bir ayrılmış sözcüktür; takma ad olmadan istek hiçbir şey okumadan başarısız olur.- Hataların tamamı
botocore.exceptions.ClientErrorolarak gelir.e.response["Error"]["Code"]üzerinden dallanın; hata başına sınıflar yalnızca istemcide üretilen öznitelikler olarak vardır (client.exceptions.ProvisionedThroughputExceededException), asla içe aktarılabilir simgeler olarak değil. - Kaynak API diğer ergonomidir.
Table.scanyerel Python türleri alır, sayılarıdecimal.Decimalolarak döndürür ve filtreleri yer tutucu haritaları yerineAttr("Year").gte(2010)ile kurar.
Filtrelenmiş bir sayfa gerçekte neye mal olur
Her biri kabaca 2 KB olan 60 öğe, ikisiyle eşleşen Year = 2024, PageSize=10, DynamoDB Local'a karşı çalıştırıldı:
page 1: Count=0 ScannedCount=10 CU=2.5 LastEvaluatedKey=yes
page 2: Count=1 ScannedCount=10 CU=2.5 LastEvaluatedKey=yes
page 3: Count=0 ScannedCount=10 CU=2.5 LastEvaluatedKey=yes
page 4: Count=1 ScannedCount=10 CU=2.5 LastEvaluatedKey=yes
page 5: Count=0 ScannedCount=10 CU=2.5 LastEvaluatedKey=yes
page 6: Count=0 ScannedCount=10 CU=2.5 LastEvaluatedKey=yes
page 7: Count=0 ScannedCount=0 CU=0.0 LastEvaluatedKey=no
total CU across pages: 15.0Altı gerçek sayfanın dördü tam fiyata hiçbir şey döndürmedi. Sayfalayıcının önlemek için var olduğu hatanın biçimi budur: Items boş olduğunda duran elle yazılmış bir döngü, 1. sayfada çıkar ve eşleşen iki şarkıyı sıfır olarak bildirir.
- sayfa diğer yarıdır. 6. sayfa
Limit'ine tablodaki son öğede çarptı, dolayısıyla DynamoDB yine de birLastEvaluatedKeydöndürdü ve sayfalayıcı, geriye bir şey kalmadığını öğrenmek için bir gidiş-dönüş daha harcadı. BirLastEvaluatedKey"durdum" demektir, "dahası var" değil.
Aynı taramada build_full_result() çağırmak CapacityUnits: 2.5 bildirir. Altı sayfa 15,0 tüketti.
Döngüyü yazmadan sayfalama
DynamoDB Query Builder, filtreyi, takma ad haritasını ve sayfalama döngüsünü çalıştırılabilir tek bir program olarak birleştirir; böylece yukarıdaki Limit-karşı-Count tuzağı siz yapıştırmadan önce halledilmiş olur. Gerçek bir tabloyu bir betikten değil, etkileşimli olarak sayfalamak için DynoTable'ı indirin.
İlgili kılavuzlar
- Query ile Scan karşılaştırması — bir
scan'in (nadiren) ne zaman gerekçelendirilebildiği. - DynamoDB Scan'im neden yavaş ve pahalı? — maliyet modeli ve ondan nasıl kaçınılacağı.
- Paralel taramalar — tabloyu
Segment/TotalSegmentsile bölmek, segment başına bir sayfalayıcı. - DynamoDB ProvisionedThroughputExceededException — tam tablo taramasının sağlanan kapasiteli bir tabloya ne yaptığı.
Kaynaklar
- Scan — Amazon DynamoDB API Reference
- scan — Boto3 DynamoDB.Client Reference
- Scan paginator — Boto3 DynamoDB Reference
- Scanning tables — Amazon DynamoDB Developer Guide
En son 2026-07-28 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.