Leer todos los elementos de DynamoDB en Python
Leer una tabla entera en boto3 significa paginar un scan hasta el final. Cada respuesta se corta en 1 MB, y el paginador integrado del cliente de bajo nivel sigue LastEvaluatedKey por todas las páginas por ti (cómo funcionan los cursores de DynamoDB).
Qué API de boto3 elijas importa aquí más que la paginación, y el paginador es solo la mitad de la razón.
Código
import boto3
client = boto3.client("dynamodb")
paginator = client.get_paginator("scan")
items = []
for page in paginator.paginate(TableName="Music"):
items.extend(page["Items"])
print(f"Table holds {len(items)} items")Explicación
- Los paginadores pertenecen al cliente, no al recurso —
boto3.resource("dynamodb").Table(…).scanno tiene paginador alguno, así que ahí el bucle deLastEvaluatedKeylo escribes tú. Eso solo ya es buena razón para usar el cliente de bajo nivel en una lectura completa. - La API de recursos convierte los números a
Decimal— un{"N": "1994"}almacenado vuelve comoDecimal('1994'), quejson.dumpsse niega a serializar sin un encoder propio. El cliente de arriba te entrega el{"N": "1994"}en crudo y te deja la conversión a ti (la codificación). - Ajusta el paginador en lugar de reemplazarlo —
paginator.paginate(TableName="Music", PaginationConfig={"PageSize": 500, "MaxItems": 10000}). Boto3 definePageSizecomo «el número de elementos devueltos por página de cada resultado» yMaxItemscomo un tope sobre el total, que emite unNextTokendesde el que reanudas conStartingToken. - Los escaneos paralelos necesitan un cliente por hilo, construido con cuidado —
SegmentyTotalSegmentsreparten el trabajo, y la propia guía de boto3 dice que los clientes son seguros para hilos mientras que las sesiones y los recursos no lo son. También avisa de que "Invokingboto3.client()inside of a concurrent context may result in response ordering issues". Construye el cliente antes de abrir en abanico, o dale a cada worker su propiaboto3.session.Session()(cuándo vale la pena paralelizar). itemscrece hasta el tamaño de la tabla — procesa cadapagedentro del bucle en vez de ir extendiendo una lista que conservas, salvo que ya sepas que la tabla es pequeña.- Un Scan factura cada byte que lee, en cada ejecución —
ProjectionExpressionencoge la respuesta y no la factura (por qué); unaFilterExpressiondescarta elementos después de haberlos leído y cobrado (Scan con filtro). En una ruta caliente lo que quieres es un Query.
Hazlo visualmente
La factura de un Scan completo es el tamaño del elemento por el número de elementos, redondeado en bloques de 4 KB. La calculadora de tamaño de elemento te da la mitad por elemento a partir de un elemento pegado.
DynoTable, en cambio, pagina una tabla en vivo en una cuadrícula de scroll infinito, y su editor SQL nombra la operación a la que compila tu consulta antes de que la ejecutes. La estimación de RCU solo aparece cuando los metadatos de la tabla lo permiten. Descarga DynoTable.
Ejemplos relacionados
- Obtener todos los elementos en Node.js — la misma lectura completa con un bucle explícito.
- Obtener todos los elementos con la AWS CLI — la CLI pagina por ti.
- DynamoDB Scan en Python — escanear con una
FilterExpression. - Escaneos paralelos — Segment/TotalSegments, número de workers y cuándo molestarse.
- ¿Por qué mi Scan de DynamoDB es lento y caro? — el modelo de coste y cómo evitarlo.
- DynamoDB ProvisionedThroughputExceededException — leer la tabla entera es la forma clásica de provocarlo.
- "The provided starting key is invalid" — una clave de reanudación corrupta en el bucle de paginación.
Referencias
- Scan — Amazon DynamoDB API Reference
- DynamoDB.Paginator.Scan — Boto3 documentation
- Scanning tables in DynamoDB — Amazon DynamoDB Developer Guide
- DynamoDB read and write operations (capacity unit consumption) — Amazon DynamoDB Developer Guide
- Paginators — Boto3 documentation
- Clients (thread safety) — Boto3 documentation
Verificado por última vez el 2026-07-28 contra la documentación oficial de AWS enlazada arriba.