DynamoDB BatchGetItem in Python (boto3)
batch_get_item holt in einer einzigen Anfrage bis zu 100 Items über ihren Primärschlüssel (maximal 16 MB). Mit dem boto3-Low-Level-Client übergibst du eine RequestItems-Zuordnung von Tabelle → Schlüssel — und du musst über UnprocessedKeys schleifen, denn ein Batch darf legitim nur einen Teil des Angeforderten zurückgeben.
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")Erklärung
RequestItems— eine Zuordnung von Tabellenname →{"Keys": [...]}; eine Anfrage kann sich über mehrere Tabellen erstrecken. Jeder Schlüssel muss der vollständige Primärschlüssel sein (Partition + Sortierung bei einem zusammengesetzten Schlüssel), in DynamoDB JSON ({"S": ...},{"N": ...}). Mehr als 100 Schlüssel, oder derselbe Schlüssel doppelt, löst eineValidationExceptionaus.Responses— eine Zuordnung von Tabellenname → die gefundenen Items. Items kommen in keiner bestimmten Reihenfolge zurück, und Schlüssel, die nicht existieren, tauchen einfach nicht auf — ordne Ergebnisse ihren Anfragen anhand ihrer Schlüsselattribute zu.UnprocessedKeys— die obige Retry-Schleife ist nicht optional. Überschreitet die Antwort 16 MB, geht der Durchsatz aus, oder überschreitet ein Partitions-Read 1 MB, gibt DynamoDB den Rest hier inRequestItems-Form zurück, bereit zum direkten Wiedereinspeisen (eine leere Zuordnung bedeutet fertig — falsy in Python, was diewhile-Schleife beendet). AWS empfiehlt dringend exponentielles Backoff zwischen Wiederholungen.- Konsistenz — Batch-Reads sind standardmäßig letztendlich konsistent; setze
"ConsistentRead": Truepro Tabelle für stark konsistente Reads. - Pro Tabelle kannst du außerdem
ProjectionExpression(mitExpressionAttributeNames) übergeben, um nur einige Attribute zu holen. - Lieber native Python-Typen statt DynamoDB JSON? Die Resource-API bietet
dynamodb.batch_get_item(...)mit einfachen Werten, aber der Retry-Kontrakt ist derselbe —UnprocessedKeysmusst du so oder so selbst leeren.
Visuell erledigen
Lieber keine DynamoDB-JSON-Schlüsselzuordnungen von Hand zusammenbauen? Der DynamoDB Expression Builder baut typisierte Schlüssel-/Wert-Zuordnungen und kopiert lauffähigen Code, und der Item-Size-Rechner zeigt, wie nah ein Batch an die 16-MB-Grenze kommt.
Um Items tabellenübergreifend in einer GUI zu holen und zu inspizieren — keine Retry-Schleifen zu schreiben — lade DynoTable herunter.
Verwandte Beispiele
- DynamoDB BatchGetItem in Node.js — derselbe Batch-Read mit AWS SDK v3.
- DynamoDB BatchGetItem mit der AWS CLI — derselbe Batch-Read aus der Shell.
- DynamoDB GetItem in Python — der Einzel-Item-Read, den dies bündelt.
- Batch-Operationen in DynamoDB — Limits, Teilfehler und wann sich Batching lohnt.
- "Too many items requested for the BatchGetItem call" — mehr als 100 Schlüssel in einer Anfrage.
- "Provided list of item keys contains duplicates" — derselbe Schlüssel doppelt in einem Batch.
References
- BatchGetItem — Amazon DynamoDB API Reference
- DynamoDB.Client.batch_get_item — Boto3 documentation
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.