從 DynamoDB 取出所有項目(Python/boto3)
在 boto3 裡讀完一整張資料表,就是把一個 scan 分頁到底。每一次回應上限是 1 MB,而低階 client 內建的 paginator 會替你逐頁追著 LastEvaluatedKey 走(DynamoDB 游標的運作方式)。
在這裡,你選哪一套 boto3 API 比分頁本身更要緊,而 paginator 只佔了原因的一半。
程式碼
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 屬於 client,不屬於 resource —
boto3.resource("dynamodb").Table(…).scan根本沒有 paginator,在那邊你得自己寫LastEvaluatedKey迴圈。光憑這一點,全表讀取就該用低階 client。 - resource API 會把數字轉成
Decimal— 存進去的{"N": "1994"}會以Decimal('1994')回來,而json.dumps沒有自訂編碼器就拒絕序列化它。上面的 client 給你的是原始的{"N": "1994"},把轉換留給你(這套編碼)。 - 調整 paginator,而不是換掉它 —
paginator.paginate(TableName="Music", PaginationConfig={"PageSize": 500, "MaxItems": 10000})。boto3 把PageSize定義為每一頁結果回傳的項目數,MaxItems則是總量上限,達到上限時會給出一個NextToken,你可以用StartingToken從那裡續跑。 - 平行 scan 每個執行緒要有自己的 client,而且要小心地建 —
Segment與TotalSegments會切分工作,而 boto3 自己的指引是 client 具備執行緒安全性,session 與 resource 則否。它也警告「Invokingboto3.client()inside of a concurrent context may result in response ordering issues」。請在展開之前先建好 client,或給每個 worker 各自的boto3.session.Session()(平行何時才划算)。 items會長到整張資料表那麼大 — 除非你已經知道資料表很小,否則請在迴圈裡就處理掉每一個page,而不是一直往一份保留著的清單裡塞。- scan 每一次執行都會對它讀到的每一個位元組計費 —
ProjectionExpression縮小的是回應,不是帳單(原因);FilterExpression是在項目被讀取並計費之後才把它們丟掉(帶篩選的 Scan)。在熱路徑上,你要的是 query。
改用視覺化操作
一次完整 scan 的帳單是項目大小乘以項目數量,並以 4 KB 為單位無條件進位。項目大小計算機可以從你貼上的項目,算出其中「每項目」的那一半。
DynoTable 則是以無限捲動的格線逐頁瀏覽線上資料表,而它的 SQL 編輯器會在你執行之前,先說出你的查詢會編譯成哪個操作。RCU 估計值只有在資料表中繼資料支援時才會出現。下載 DynoTable。
相關範例
- 在 Node.js 中取出所有項目 — 同一種完整讀取,搭配明確的迴圈。
- 用 AWS CLI 取出所有項目 — CLI 會替你分頁。
- Python 中的 DynamoDB Scan — 帶
FilterExpression的掃描。 - 平行 scan — Segment/TotalSegments、worker 數量,以及值不值得動用。
- 為什麼我的 DynamoDB Scan 又慢又貴? — 成本模型,以及如何避開它。
- DynamoDB ProvisionedThroughputExceededException — 讀整張資料表是撞上它的經典方式。
- 「The provided starting key is invalid」 — 分頁迴圈裡被弄壞的續傳索引鍵。
參考資料
- 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
最後驗證於 2026-07-28,對照上方連結的 AWS 官方文件。