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 recursoboto3.resource("dynamodb").Table(…).scan no tiene paginador alguno, así que ahí el bucle de LastEvaluatedKey lo 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 como Decimal('1994'), que json.dumps se 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 reemplazarlopaginator.paginate(TableName="Music", PaginationConfig={"PageSize": 500, "MaxItems": 10000}). Boto3 define PageSize como «el número de elementos devueltos por página de cada resultado» y MaxItems como un tope sobre el total, que emite un NextToken desde el que reanudas con StartingToken.
  • Los escaneos paralelos necesitan un cliente por hilo, construido con cuidadoSegment y TotalSegments reparten 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 "Invoking boto3.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 propia boto3.session.Session() (cuándo vale la pena paralelizar).
  • items crece hasta el tamaño de la tabla — procesa cada page dentro 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ónProjectionExpression encoge la respuesta y no la factura (por qué); una FilterExpression descarta 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

Referencias

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

Construye esta solicitud visualmente

Compón esta operación en el Generador de consultas de DynamoDB gratuito —condición de clave, filtro, índice, Limit, orden de clasificación y un bucle de paginación— y cópiala de vuelta como un programa ejecutable para SDK v3, CLI o boto3.

Abrir el Generador de consultas de DynamoDB

Trabaja con DynamoDB sin la Consola

Un cliente de escritorio rápido para DynamoDB que ejecuta el SQL real que DynamoDB no puede — JOINs, GROUP BY, agregaciones — con edición visual y un agente de IA con tus propias claves de Bedrock.

Prueba gratuita de 30 días, sin tarjeta — después, el plan Free sin límite de tiempo.