DynamoDB BatchGetItem en Python (boto3)
batch_get_item obtiene hasta 100 items por clave primaria en una sola solicitud (16 MB máximo). Con el cliente de bajo nivel de boto3 pasas un mapa RequestItems de tabla → claves — y debes iterar sobre UnprocessedKeys, porque un lote puede legítimamente devolver solo una parte de lo que pediste.
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")Explicación
RequestItems— un mapa de nombre de tabla →{"Keys": [...]}; una sola solicitud puede abarcar varias tablas. Cada clave debe ser la clave primaria completa (partición + ordenación para una clave compuesta), en DynamoDB JSON ({"S": ...},{"N": ...}). Más de 100 claves, o la misma clave dos veces, lanza unaValidationException.Responses— un mapa de nombre de tabla → los items encontrados. Los items vuelven sin ningún orden concreto, y las claves que no existen simplemente no aparecen — empareja los resultados con las solicitudes por sus atributos de clave.UnprocessedKeys— el bucle de reintento anterior no es opcional. Si la respuesta supera los 16 MB, se agota el rendimiento o una lectura de partición supera 1 MB, DynamoDB devuelve el resto aquí en forma deRequestItems, listo para volver a introducirlo directamente (un mapa vacío significa que ha terminado — falsy en Python, que es lo que finaliza elwhile). AWS recomienda encarecidamente un retroceso exponencial entre reintentos.- Consistencia — las lecturas por lotes son con consistencia eventual por defecto; pon
"ConsistentRead": Truepor tabla para lecturas con consistencia fuerte. - Por tabla también puedes pasar
ProjectionExpression(conExpressionAttributeNames) para obtener solo algunos atributos. - ¿Prefieres tipos nativos de Python en lugar de DynamoDB JSON? La API de recurso ofrece
dynamodb.batch_get_item(...)con valores simples, pero el contrato de reintento es el mismo —UnprocessedKeyses tuyo para drenar de una manera u otra.
Hazlo visualmente
¿Prefieres no montar a mano los mapas de claves en DynamoDB JSON? El DynamoDB Expression Builder construye mapas tipados de clave/valor y copia código ejecutable, y la calculadora de tamaño de item muestra lo cerca que queda un lote del techo de 16 MB.
Para obtener e inspeccionar items entre tablas en una interfaz gráfica — sin bucles de reintento que escribir — descarga DynoTable.
Ejemplos relacionados
- DynamoDB BatchGetItem en Node.js — la misma lectura por lotes con AWS SDK v3.
- DynamoDB BatchGetItem con la AWS CLI — la misma lectura por lotes desde el shell.
- DynamoDB GetItem en Python — la lectura de un único item que esto agrupa por lotes.
- Operaciones por lotes en DynamoDB — límites, fallo parcial y cuándo compensa el procesamiento por lotes.
- "Too many items requested for the BatchGetItem call" — más de 100 claves en una sola solicitud.
- "Provided list of item keys contains duplicates" — la misma clave dos veces en un lote.
References
- BatchGetItem — Amazon DynamoDB API Reference
- DynamoDB.Client.batch_get_item — Boto3 documentation
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
Verificado por última vez el 2026-07-13 contra la documentación oficial de AWS enlazada arriba.