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 una ValidationException.
  • 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 de RequestItems, listo para volver a introducirlo directamente (un mapa vacío significa que ha terminado — falsy en Python, que es lo que finaliza el while). AWS recomienda encarecidamente un retroceso exponencial entre reintentos.
  • Consistencia — las lecturas por lotes son con consistencia eventual por defecto; pon "ConsistentRead": True por tabla para lecturas con consistencia fuerte.
  • Por tabla también puedes pasar ProjectionExpression (con ExpressionAttributeNames) 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 — UnprocessedKeys es 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

References

Verificado por última vez el 2026-07-13 contra la documentación oficial de AWS enlazada arriba.

Trabaja con DynamoDB sin la Consola

DynoTable es un cliente de escritorio rápido para DynamoDB: explora tablas, ejecuta consultas estilo SQL y edita Items localmente.