Python (boto3) で DynamoDB のすべてのアイテムを取得する

DynamoDB に「select all」はありません。テーブル全体を読み取るとは、最後までページネーションする scan を意味します。各レスポンスは最大でも1 MB を運びます。boto3 の組み込みのスキャンページネーターが、すべてのページにわたって LastEvaluatedKey を代わりにたどります。

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

Explanation

  • ページネーターこそが要点 — 単一の scan 呼び出しはテーブルを返しません。最大1 MB を返します。client.get_paginator("scan") は、テーブルが尽きるまで(LastEvaluatedKeyExclusiveStartKey として戻しながら)後続のリクエストを発行します。アイテムが「欠落」していると悩むときに人が忘れるループです。(手作業でやりますか?レスポンスに LastEvaluatedKey が含まれる限り呼び出し続けてください。)
  • メモリitems はテーブル全体を保持します。大きなテーブルでは、蓄積する代わりにループ内で各 page を処理してください(ファイルに書き込む、ストリームする、集計する)。
  • 大きなテーブルでより高速: 並列スキャンSegment=i, TotalSegments=N を渡し、N 個のワーカー(スレッド/プロセス)を実行します。それぞれが自分のセグメントをページネーションします。合計コストは同じで、実時間は大幅に短くなります。
  • コスト — フルスキャンは、実行するたびにすべてのアイテムの全バイトを読み取り(課金し)ます。ProjectionExpression はレスポンスを縮めますが、請求は縮めません。スキャンをホットパスに置かないでください。それは query とアクセスパターン設計のためのものです。
  • アイテムは DynamoDB JSON({"S": ...})で返ります。ネイティブな Python 型がほしいですか?リソースAPI を使ってください(table.scan + 手動の LastEvaluatedKey ループ。リソース API にはページネーターがありません)。

Do it visually

テーブルをざっと見るのにスクリプトは要りません。DynoTable をダウンロードすれば、任意のテーブルをページネーションされたグリッドで閲覧できます。スキャンのページ送りを代わりに行うので、間違えるループはありません。そしてスキャンして課金される前に、DynamoDB pricing calculator がテーブルのフル読み取りが実際にいくらかかるかを示します。

References

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

このリクエストをビジュアルに組み立てる

この操作を無料の DynamoDB クエリビルダーで組み立て — キー条件、フィルタ、インデックス、Limit、ソート順、ページネーションループ — 実行可能な SDK v3・CLI・boto3 のプログラムとしてコピーして戻れます。

DynamoDB クエリビルダーを開く

Console なしで DynamoDB を扱う

DynoTable は DynamoDB 向けの高速なデスクトップクライアントです — テーブルを閲覧し、SQL スタイルのクエリを実行し、アイテムをローカルで編集できます。