Python'da DynamoDB BatchGetItem (boto3)

batch_get_item, tek bir istekte birincil anahtara göre 100'e kadar öğe getirir (en fazla 16 MB). boto3 düşük seviyeli istemcisi ile tablo → anahtarlar şeklinde bir RequestItems eşlemesi geçirirsiniz — ve UnprocessedKeys üzerinde döngü yapmak zorundasınız, çünkü bir toplu istek yasal olarak istediğinizin yalnızca bir kısmını döndürebilir.

Code

import time

import boto3

client = boto3.client("dynamodb")

request_items = {
    "Music": {
        "Keys": [
            {"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}},
            {"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "A Mis Abuelos"}},
            {"Artist": {"S": "Ella Fitzgerald"}, "SongTitle": {"S": "Misty"}},
        ]
    }
}

items = []
attempt = 0

while request_items:
    response = client.batch_get_item(RequestItems=request_items)
    items.extend(response["Responses"].get("Music", []))

    # A partial result is NOT an error: throttling, a >16 MB response, or an
    # internal failure returns the leftovers in UnprocessedKeys. Retry them
    # with exponential backoff.
    request_items = response["UnprocessedKeys"]
    if request_items:
        attempt += 1
        time.sleep(min(0.1 * 2**attempt, 5))

print(f"Fetched {len(items)} items")

Açıklama

  • RequestItems — tablo adı → {"Keys": [...]} şeklinde bir eşleme; bir istek birden çok tabloya yayılabilir. Her anahtar, DynamoDB JSON'da ({"S": ...}, {"N": ...}) tam birincil anahtar olmalıdır (bileşik bir anahtar için bölüm + sıralama). 100'den fazla anahtar ya da aynı anahtarın iki kez geçmesi bir ValidationException fırlatır.
  • Responses — tablo adı → bulunan öğeler şeklinde bir eşleme. Öğeler belirli bir sırada olmadan döner ve var olmayan anahtarlar basitçe görünmez — sonuçları anahtar özniteliklerine göre isteklerle eşleştirin.
  • UnprocessedKeys — yukarıdaki yeniden deneme döngüsü isteğe bağlı değildir. Yanıt 16 MB'ı aşarsa, iş hacmi tükenirse ya da bir bölüm okuması 1 MB'ı aşarsa, DynamoDB kalanı burada RequestItems biçiminde döndürür ve doğrudan geri beslenmeye hazırdır (boş bir eşleme bittiği anlamına gelir — Python'da falsy olur, while'ı sonlandıran budur). AWS, yeniden denemeler arasında üstel geri çekilmeyi şiddetle önerir.
  • Tutarlılık — toplu okumalar varsayılan olarak nihai tutarlıdır; güçlü tutarlı okumalar için tablo başına "ConsistentRead": True ayarlayın.
  • Tablo başına, yalnızca bazı öznitelikleri getirmek için ayrıca ProjectionExpression (ExpressionAttributeNames ile) geçirebilirsiniz.
  • DynamoDB JSON yerine yerel Python türlerini mi tercih edersiniz? resource API'si düz değerlerle dynamodb.batch_get_item(...) sunar, ancak yeniden deneme sözleşmesi aynıdır — UnprocessedKeys'i boşaltmak her iki durumda da sizin göreviniz.

Görsel olarak yapın

DynamoDB-JSON anahtar eşlemelerini elle bir araya getirmemeyi mi tercih edersiniz? DynamoDB Expression Builder, türlü anahtar/değer eşlemeleri oluşturur ve çalıştırılabilir kodu kopyalar; öğe boyutu hesaplayıcı ise bir toplu isteğin 16 MB tavanına ne kadar yaklaştığını gösterir.

Yeniden deneme döngüleri yazmadan, tablolar arası öğeleri bir grafik arayüzde (GUI) getirmek ve incelemek için — DynoTable'ı indirin.

İlgili örnekler

References

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

Console olmadan DynamoDB ile çalışın

DynoTable, DynamoDB için hızlı bir masaüstü istemcisidir — tablolara göz atın, SQL tarzı sorgular çalıştırın ve item'ları yerel olarak düzenleyin.