Récupérer tous les éléments de DynamoDB en Python (boto3)

Lire une table entière en boto3, c'est paginer un scan jusqu'au bout. Chaque réponse est plafonnée à 1 MB, et le paginateur intégré du client bas niveau suit LastEvaluatedKey de page en page à ta place (comment fonctionnent les curseurs DynamoDB).

L'API boto3 que tu choisis compte davantage ici que la pagination, et le paginateur n'est que la moitié de la raison.

Code

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")

Explication

  • Les paginateurs appartiennent au client, pas à la resourceboto3.resource("dynamodb").Table(…).scan n'a aucun paginateur, donc là-bas c'est toi qui écris la boucle sur LastEvaluatedKey. À soi seul, c'est déjà une bonne raison d'utiliser le client bas niveau pour une lecture complète.
  • L'API resource convertit les nombres en Decimal — un {"N": "1994"} stocké revient en Decimal('1994'), que json.dumps refuse de sérialiser sans encodeur personnalisé. Le client ci-dessus te rend le {"N": "1994"} brut et te laisse la conversion (l'encodage).
  • Règle le paginateur plutôt que de le remplacerpaginator.paginate(TableName="Music", PaginationConfig={"PageSize": 500, "MaxItems": 10000}). Boto3 définit PageSize comme "the number of items returned per page of each result" et MaxItems comme un plafond sur le total, qui émet un NextToken depuis lequel tu reprends avec StartingToken.
  • Les scans parallèles demandent un client par thread, construit avec soinSegment et TotalSegments répartissent le travail, et la propre recommandation de boto3 est que les clients sont thread-safe alors que les sessions et les resources ne le sont pas. Elle avertit aussi que "Invoking boto3.client() inside of a concurrent context may result in response ordering issues". Construis le client avant de faire le fan-out, ou donne à chaque worker sa propre boto3.session.Session() (quand le parallèle en vaut la peine).
  • items grossit jusqu'à la taille de la table — traite chaque page dans la boucle plutôt que d'étendre une liste que tu conserves, sauf si tu sais déjà que la table est petite.
  • Un scan facture chaque octet qu'il lit, à chaque exécutionProjectionExpression réduit la réponse et non la facture (pourquoi) ; une FilterExpression écarte les éléments après qu'ils ont été lus et facturés (Scan avec un filtre). Sur un chemin critique, ce qu'il te faut, c'est une Query.

Le faire visuellement

La facture d'un scan complet, c'est la taille des éléments multipliée par leur nombre, arrondie au supérieur par tranches de 4 KB. Le calculateur de taille d'élément te donne la moitié « par élément » à partir d'un élément collé.

DynoTable parcourt plutôt une table en direct dans une grille à défilement infini, et son éditeur SQL nomme l'opération vers laquelle ta requête compile avant que tu ne l'exécutes. L'estimation RCU n'apparaît que si les métadonnées de la table le permettent. Télécharge DynoTable.

Exemples liés

Références

Dernière vérification le 2026-07-28 par rapport à la documentation officielle AWS liée ci-dessus.

Construis cette requête visuellement

Compose cette opération dans le Générateur de requêtes DynamoDB gratuit — condition de clé, filtre, index, Limit, ordre de tri et boucle de pagination — et copie-la en retour comme programme exécutable SDK v3, CLI ou boto3.

Ouvrir le Générateur de requêtes DynamoDB

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.