在 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,而且要小心构造——SegmentTotalSegments 负责切分工作量,而 boto3 自己的指引是 client 线程安全、session 和 resource 不是。它还警告说「在并发上下文里调用 boto3.client() 可能导致响应顺序错乱」。要么在扇出之前就把 client 建好,要么给每个工作线程自己的 boto3.session.Session()并行什么时候值得)。
  • items 会长到整张表那么大——在循环里处理每一个 page,而不是不断往一个留着的列表里追加,除非你早就知道这张表很小。
  • 扫描每跑一次,读到的每一个字节都要计费——ProjectionExpression 缩小的是响应,不是账单(原因);FilterExpression 是在项目被读取并计费之后才把它们丢掉(带过滤的 Scan)。在热路径上你要的是 query

用可视化的方式来做

一次全表扫描的账单,是项目大小乘以项目数量,按 4 KB 为单位向上取整。项目大小计算器会从你粘贴进去的项目算出其中单项目那一半。

DynoTable 则是在一个无限滚动的网格里翻阅活的表,而它的 SQL 编辑器会在你运行之前告诉你查询会编译成哪种操作。RCU 估算只有在表元数据支持时才会出现。下载 DynoTable

相关示例

参考资料

最后核实于 2026-07-28,依据上方链接的 AWS 官方文档。

可视化构建此请求

在免费的 DynamoDB 查询构建器中组装此操作 —— 键条件、筛选、索引、Limit、排序方向和分页循环 —— 再把它作为可运行的 SDK v3、CLI 或 boto3 程序复制回来。

打开 DynamoDB 查询构建器

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。