DynamoDB BatchGetItem di Python (boto3)

batch_get_item mengambil hingga 100 item berdasarkan primary key dalam satu request (maksimum 16 MB). Dengan boto3 low-level client Anda melewatkan map RequestItems dari tabel → key — dan Anda harus melakukan loop pada UnprocessedKeys, karena sebuah batch secara sah bisa mengembalikan hanya sebagian dari yang Anda minta.

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")

Penjelasan

  • RequestItems — map dari nama tabel → {"Keys": [...]}; satu request bisa mencakup beberapa tabel. Setiap key harus berupa primary key lengkap (partition + sort untuk key komposit), dalam DynamoDB JSON ({"S": ...}, {"N": ...}). Lebih dari 100 key, atau key yang sama dua kali, memunculkan ValidationException.
  • Responses — map dari nama tabel → item yang ditemukan. Item kembali dalam urutan yang tidak tertentu, dan key yang tidak ada cukup tidak muncul — cocokkan hasil dengan permintaan berdasarkan atribut key-nya.
  • UnprocessedKeys — loop retry di atas bukan opsional. Jika response melewati 16 MB, throughput habis, atau sebuah pembacaan partition melewati 1 MB, DynamoDB mengembalikan sisanya di sini dalam bentuk RequestItems, siap dimasukkan kembali (map kosong berarti selesai — falsy di Python, yang itulah yang mengakhiri while). AWS sangat menyarankan exponential backoff di antara percobaan ulang.
  • Konsistensi — pembacaan batch bersifat eventually consistent secara default; setel "ConsistentRead": True per tabel untuk pembacaan strongly-consistent.
  • Per tabel Anda juga bisa melewatkan ProjectionExpression (dengan ExpressionAttributeNames) untuk mengambil hanya sebagian atribut.
  • Lebih suka tipe Python native alih-alih DynamoDB JSON? Resource API menawarkan dynamodb.batch_get_item(...) dengan nilai biasa, tetapi kontrak retry-nya sama — UnprocessedKeys tetap tugas Anda untuk dikuras bagaimanapun juga.

Lakukan secara visual

Lebih suka tidak merakit map key DynamoDB-JSON dengan tangan? DynamoDB Expression Builder membangun map key/value bertipe dan menyalin kode yang bisa dijalankan, dan kalkulator ukuran item menunjukkan seberapa dekat sebuah batch dengan plafon 16 MB.

Untuk mengambil dan memeriksa item di seluruh tabel dalam GUI — tanpa loop retry untuk ditulis — unduh DynoTable.

Contoh terkait

References

Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Bekerja dengan DynamoDB tanpa Console

DynoTable adalah klien desktop yang cepat untuk DynamoDB — jelajahi tabel, jalankan query gaya SQL, dan edit Item secara lokal.