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.json iç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ü Limit limit_key'dir. Limit, okunan öğeleri sınırlar, asla döndürülen öğeleri değil; dolayısıyla bir FilterExpression ile bir sayfa boş olabilir ve yine de maliyeti olur.
  • MaxItems, result_key öğelerini sayar ve size daha sonraki bir süreçte StartingToken olarak geçirebileceğiniz bir NextToken verir. İsteğin kesme noktanızın ötesini okumasını durdurmaz.
  • build_full_result() yalnızca result_key alanlarını toplar. Items, Count ve ScannedCount toplanır; ConsumedCapacity bir non_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.
  • FilterExpression sunucu tarafında okumadan sonra çalışır, dolayısıyla Count üzerinden değil ScannedCount ü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.ClientError olarak 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.scan yerel Python türleri alır, sayıları decimal.Decimal olarak döndürür ve filtreleri yer tutucu haritaları yerine Attr("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.0

Altı 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.

  1. sayfa diğer yarıdır. 6. sayfa Limit'ine tablodaki son öğede çarptı, dolayısıyla DynamoDB yine de bir LastEvaluatedKey döndürdü ve sayfalayıcı, geriye bir şey kalmadığını öğrenmek için bir gidiş-dönüş daha harcadı. Bir LastEvaluatedKey "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

Kaynaklar

En son 2026-07-28 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

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.