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, memunculkanValidationException.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 bentukRequestItems, siap dimasukkan kembali (map kosong berarti selesai — falsy di Python, yang itulah yang mengakhiriwhile). AWS sangat menyarankan exponential backoff di antara percobaan ulang.- Konsistensi — pembacaan batch bersifat eventually consistent secara default; setel
"ConsistentRead": Trueper tabel untuk pembacaan strongly-consistent. - Per tabel Anda juga bisa melewatkan
ProjectionExpression(denganExpressionAttributeNames) 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 —UnprocessedKeystetap 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
- DynamoDB BatchGetItem di Node.js — pembacaan batch yang sama dengan AWS SDK v3.
- DynamoDB BatchGetItem dengan AWS CLI — pembacaan batch yang sama dari shell.
- DynamoDB GetItem di Python — pembacaan satu item yang ini batch-kan.
- Operasi batch di DynamoDB — batas, kegagalan parsial, dan kapan batching sepadan.
- "Too many items requested for the BatchGetItem call" — lebih dari 100 key dalam satu request.
- "Provided list of item keys contains duplicates" — key yang sama dua kali dalam satu batch.
References
- BatchGetItem — Amazon DynamoDB API Reference
- DynamoDB.Client.batch_get_item — Boto3 documentation
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.