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 定价计算器会显示完整读取你的表实际花费多少。

相关示例

References

Last verified 2026-07-13 against the official AWS documentation linked above.

可视化构建此请求

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

打开 DynamoDB 查询构建器

无需控制台即可使用 DynamoDB

DynoTable 是面向 DynamoDB 的快速桌面客户端 —— 浏览表、运行 SQL 风格的查询,并在本地编辑项。