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 resource —
boto3.resource("dynamodb").Table(…).scann'a aucun paginateur, donc là-bas c'est toi qui écris la boucle surLastEvaluatedKey. À 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 enDecimal('1994'), quejson.dumpsrefuse 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 remplacer —
paginator.paginate(TableName="Music", PaginationConfig={"PageSize": 500, "MaxItems": 10000}). Boto3 définitPageSizecomme "the number of items returned per page of each result" etMaxItemscomme un plafond sur le total, qui émet unNextTokendepuis lequel tu reprends avecStartingToken. - Les scans parallèles demandent un client par thread, construit avec soin —
SegmentetTotalSegmentsré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 "Invokingboto3.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 propreboto3.session.Session()(quand le parallèle en vaut la peine). itemsgrossit jusqu'à la taille de la table — traite chaquepagedans 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écution —
ProjectionExpressionréduit la réponse et non la facture (pourquoi) ; uneFilterExpressioné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écupérer tous les éléments en Node.js — la même lecture complète avec une boucle explicite.
- Récupérer tous les éléments avec l'AWS CLI — la CLI pagine pour toi.
- DynamoDB Scan en Python — scanner avec une
FilterExpression. - Les scans parallèles — Segment/TotalSegments, nombre de workers, et quand ça vaut la peine.
- Pourquoi mon Scan DynamoDB est-il lent et coûteux ? — le modèle de coût et comment l'éviter.
- DynamoDB ProvisionedThroughputExceededException — lire la table entière est la façon classique de la déclencher.
- "The provided starting key is invalid" — une clé de reprise abîmée dans la boucle de pagination.
Références
- 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
Dernière vérification le 2026-07-28 par rapport à la documentation officielle AWS liée ci-dessus.