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 eine ValidationException aus.
  • 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 in RequestItems-Form zurück, bereit zum direkten Wiedereinspeisen (eine leere Zuordnung bedeutet fertig — falsy in Python, was die while-Schleife beendet). AWS empfiehlt dringend exponentielles Backoff zwischen Wiederholungen.
  • Konsistenz — Batch-Reads sind standardmäßig letztendlich konsistent; setze "ConsistentRead": True pro Tabelle für stark konsistente Reads.
  • Pro Tabelle kannst du außerdem ProjectionExpression (mit ExpressionAttributeNames) ü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 — UnprocessedKeys musst 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

References

Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.

Mit DynamoDB ohne die Console arbeiten

DynoTable ist ein schneller Desktop-Client für DynamoDB — durchsuche Tabellen, führe SQL-artige Queries aus und bearbeite Items lokal.