用 AWS CLI 取出 DynamoDB 的全部项目

AWS CLI 把分页藏起来了。aws dynamodb scan 会按这张表的需要发起任意多次 1 MB 的服务调用,然后打印一份合并后的结果,所以读十个项目的命令和读一千万个项目的命令是同一条命令。

这既是它的方便之处,也是它的陷阱。调用次数、内存和账单都随着表一起涨,而那行命令还是那一行。

代码

aws dynamodb scan --table-name 'Music'

合并后的输出里装着表中的每一个项目:

{
    "Items": [
        {"Artist": {"S": "Arturo Sandoval"}, "SongTitle": {"S": "Cubano Chant"}, ...}
    ],
    "Count": 1287,
    "ScannedCount": 1287
}

说明

  • --no-paginate 是那个只调一次的开关——它让 CLI 不再跟着游标走,于是你拿到第一页,别的什么都没有。看一眼可以,做完整读取就不行了(游标是怎么工作的)。
  • --page-size 改变的是调用次数,不是输出——AWS 说得很直白:"Changing the page size doesn't affect the output; it affects only the number of API calls that need to be made to generate the output."。当一个大页面超时的时候才动它,绝不是为了省钱。两种方式的读取成本完全一样。
  • --max-items 是输出停下、NextToken 开始的地方——它会打印那么多个项目,外加一个给 --starting-token 用的续读令牌。把它和 --page-size 设成同一个数:AWS 警告说取值不同"can get unexpected results with missing or duplicated items"。
  • --query 是在你自己的机器上跑的——它是作用在已打印结果上的 JMESPath,在每个项目都被读取并计费之后才应用。DynamoDB 看得到的是 --projection-expression(再加上给保留字用的 --expression-attribute-names),而它缩小的是响应,不是账单。--filter-expression 同样是在项目被计费之后才把它们丢掉的(带过滤的 Scan)。
  • 一切都先缓冲,然后撞上分页器——CLI 会把所有页面攒齐了再打印,而 CLI v2 默认会把结果送进 macOS 和 Linux 上的 less 或 Windows 上的 more。在一张大表上,这同时意味着一次内存尖峰和一个卡住的终端。加上 --no-cli-pager,或者把 AWS_PAGER 设为空字符串,并用 --max-items 切片。
  • 并行扫描在命令行里同样可用——用 --segment i --total-segments N 跑 N 份,每一份自动给自己那一片分页。总成本相同,墙上时钟时间低得多(什么时候值得这么做)。

用可视化的方式来做

一条单行命令可能是一条昂贵的命令。DynamoDB 定价计算器会在你运行之前,给完整读一遍你的表标个价。

DynoTable 是在网格里翻页浏览这张表,而不是在终端缓冲区里,并且能把那个网格背后的 Scan 导出成一条 aws dynamodb 命令。下载 DynoTable

相关示例

参考资料

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

可视化构建此请求

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

打开 DynamoDB 查询构建器

无需控制台即可使用 DynamoDB

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

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