在 Python(boto3)中讀取 DynamoDB 所有項目
DynamoDB 沒有「select all」— 讀取整個表格意味著一個你要分頁到底的 scan。每個回應最多帶 1 MB;boto3 內建的 scan paginator 會為你跨每一頁追蹤 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")說明
- paginator 才是重點 — 單次
scan呼叫並不會回傳整個表格;它最多回傳 1 MB。client.get_paginator("scan")會發出後續請求(把LastEvaluatedKey餵回作為ExclusiveStartKey)直到表格耗盡 — 也就是人們納悶項目為何「不見了」時忘掉的那個迴圈。(要自己手動處理?只要回應含有LastEvaluatedKey就持續呼叫。) - 記憶體 —
items持有整個表格。對大表格,請在迴圈內處理每一個page(寫入檔案、串流、彙整),而非一路累積。 - 在大表格上更快:平行 scan — 傳入
Segment=i, TotalSegments=N並執行 N 個 worker(thread/process),每個各自對自己的 segment 分頁。總成本相同,但實際耗時大幅降低。 - 成本 — 完整 scan 每次執行都會讀取(並計費)每個項目的每個位元組。
ProjectionExpression縮小的是回應,而非帳單;別把 scan 放在熱路徑上 — 那是 query 與存取模式設計的用武之地。 - 項目以 DynamoDB JSON 回傳(
{"S": ...})。偏好原生的 Python 型別?請用 resource API(table.scan+ 手動的LastEvaluatedKey迴圈 — resource API 沒有 paginator)。
改用視覺化操作
單純看看一個表格,不需要指令稿:下載 DynoTable 即可在分頁的格線中瀏覽任何表格 — 它會為你翻過 scan 的分頁,沒有迴圈可寫錯。而在你 scan 並付費之前,DynamoDB 定價計算機 會顯示完整讀取一次你的表格實際花多少。
相關範例
- 在 Node.js 中讀取所有項目 — 以明確的迴圈執行相同的完整讀取。
- 使用 AWS CLI 讀取所有項目 — CLI 為你分頁。
- 在 Python 中使用 DynamoDB Scan — 帶
FilterExpression的 scan。 - 平行 Scan — Segment/TotalSegments、worker 數量,以及何時值得。
- 為什麼我的 DynamoDB Scan 又慢又貴? — 成本模型以及如何避免它。
- DynamoDB ProvisionedThroughputExceededException — 讀取整個表格是撞上它的經典做法。
- "The provided starting key is invalid" — 分頁迴圈中損壞的續讀 key。
References
- 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
最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。