Python(boto3)中从 DynamoDB 获取所有项目
DynamoDB 中没有"select all"——读取整张表意味着一次你要分页到底的 scan。每个响应最多携带 1 MB;boto3 内置的 scan 分页器会替你跨每一页跟随 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")说明
- 分页器才是关键 — 单次
scan调用不会返回整张表;它返回至多 1 MB。client.get_paginator("scan")会发起后续请求(把LastEvaluatedKey作为ExclusiveStartKey送回),直到表被读尽——这正是人们纳闷为什么项目会"丢失"时忘掉的那个循环。(想手动做?只要响应包含LastEvaluatedKey就继续调用。) - 内存 —
items会持有整张表。对于大表,请在循环内处理每一个page(写入文件、流式处理、聚合),而不是累积。 - 大表上更快:并行 scan — 传入
Segment=i, TotalSegments=N并运行 N 个工作单元(线程/进程),每个对自己的段分页。总成本相同,但墙钟时间大幅降低。 - 成本 — 一次全表 scan 每次运行都会读取(并计费)每个项目的每个字节。
ProjectionExpression缩小的是响应,而非账单;不要把 scan 放在热路径上——那是 query 和访问模式设计要解决的事。 - 项目以 DynamoDB JSON(
{"S": ...})形式返回。更想用原生 Python 类型?请用 resource API(table.scan加一个手动的LastEvaluatedKey循环——resource API 没有分页器)。
可视化操作
浏览一张表不需要脚本:下载 DynoTable 即可在分页网格中浏览任何表——它会替你翻阅 scan 的各页,没有写错循环的风险。而在你 scan 并付费之前,DynamoDB 定价计算器会显示完整读取你的表实际花费多少。
相关示例
- Node.js 中获取所有项目 — 用一个显式循环完成同样的全表读取。
- 使用 AWS CLI 获取所有项目 — CLI 会替你翻页。
- Python 中的 DynamoDB Scan — 带
FilterExpression的扫描。 - 并行 scan — Segment/TotalSegments、工作线程数量,以及何时值得这么做。
- 为什么我的 DynamoDB Scan 又慢又贵? — 成本模型以及如何避免。
- DynamoDB ProvisionedThroughputExceededException — 读取整张表是撞上它的经典方式。
- "The provided starting key is invalid" — 分页循环中损坏的续读键。
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
Last verified 2026-07-13 against the official AWS documentation linked above.