在 Python(boto3)中读取 DynamoDB 全部项目
在 boto3 里读整张表,意味着把一次 scan 分页到底。每次响应上限是 1 MB,而低层 client 内置的分页器会替你沿着 LastEvaluatedKey 走完每一页(DynamoDB 游标是怎么工作的)。
在这里,你挑哪套 boto3 API 比分页本身更要紧,而分页器只是原因的一半。
代码
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")说明
- 分页器属于 client,不属于 resource——
boto3.resource("dynamodb").Table(…).scan压根没有分页器,所以在那边你得自己写LastEvaluatedKey循环。单凭这一点,全表读取就该用低层 client。 - 资源 API 会把数字转成
Decimal——存进去的{"N": "1994"}回来时是Decimal('1994'),而json.dumps没有自定义编码器就拒绝序列化它。上面那个 client 把原始的{"N": "1994"}交给你,转换留给你自己做(这套编码)。 - 去调分页器,而不是换掉它——
paginator.paginate(TableName="Music", PaginationConfig={"PageSize": 500, "MaxItems": 10000})。Boto3 把PageSize定义为「每一页结果返回的项目数」,把MaxItems定义为总数上限,后者会给出一个NextToken,你用StartingToken从那里续上。 - 并行扫描需要每个线程一个 client,而且要小心构造——
Segment和TotalSegments负责切分工作量,而 boto3 自己的指引是 client 线程安全、session 和 resource 不是。它还警告说「在并发上下文里调用boto3.client()可能导致响应顺序错乱」。要么在扇出之前就把 client 建好,要么给每个工作线程自己的boto3.session.Session()(并行什么时候值得)。 items会长到整张表那么大——在循环里处理每一个page,而不是不断往一个留着的列表里追加,除非你早就知道这张表很小。- 扫描每跑一次,读到的每一个字节都要计费——
ProjectionExpression缩小的是响应,不是账单(原因);FilterExpression是在项目被读取并计费之后才把它们丢掉(带过滤的 Scan)。在热路径上你要的是 query。
用可视化的方式来做
一次全表扫描的账单,是项目大小乘以项目数量,按 4 KB 为单位向上取整。项目大小计算器会从你粘贴进去的项目算出其中单项目那一半。
DynoTable 则是在一个无限滚动的网格里翻阅活的表,而它的 SQL 编辑器会在你运行之前告诉你查询会编译成哪种操作。RCU 估算只有在表元数据支持时才会出现。下载 DynoTable。
相关示例
- Node.js 中读取全部项目——用显式循环做同样的全表读取。
- 用 AWS CLI 读取全部项目——CLI 会替你翻页。
- Python 中的 DynamoDB Scan——带
FilterExpression的扫描。 - 并行扫描——Segment/TotalSegments、工作线程数,以及什么时候值得费这个劲。
- 为什么我的 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 官方文档。