免费工具

DynamoDB 查询构建器

组合整个 Query 或 Scan 请求——表、索引、键条件、筛选条件、投影、Limit、排序顺序、强一致性读取和分页——并复制为可直接运行的 AWS SDK v3、DocumentClient、CLI、boto3、Java、Go、.NET、Rust、Kotlin、PHP、Ruby 或 DynamoDB-Toolbox 程序,或复制 PartiQL 语句。

组装你的请求
请求选项
可运行的代码
import { DynamoDBClient, QueryCommand } from "@aws-sdk/client-dynamodb";

const client = new DynamoDBClient({});

const params = {
  "TableName": "Orders",
  "KeyConditionExpression": "#hashKey = :hashKeyValue AND begins_with(#rangeKey, :rangeKeyValue)",
  "ExpressionAttributeNames": {
    "#hashKey": "pk",
    "#rangeKey": "sk"
  },
  "ExpressionAttributeValues": {
    ":hashKeyValue": {
      "S": "USER#123"
    },
    ":rangeKeyValue": {
      "S": "ORDER#"
    }
  },
  "Limit": 25
};

const items = [];
let lastEvaluatedKey;
do {
  const page = await client.send(
    new QueryCommand({ ...params, ExclusiveStartKey: lastEvaluatedKey })
  );
  items.push(...(page.Items ?? []));
  lastEvaluatedKey = page.LastEvaluatedKey;
} while (lastEvaluatedKey);

console.log(items);

dynamodb-expression-builder 是这个工具背后的开源(MIT)库。

从访问模式到可运行的请求

表达式很少是全部工作。生产环境的 Query 还要决定读哪个索引、每次请求评估多少项、排序键朝哪个方向遍历、读取是否必须强一致,以及响应带着 LastEvaluatedKey 回来时该怎么办。这些请求级参数位于表达式字符串之外 —— 复制粘贴的代码片段通常就是在这里出错。

这个构建器把请求当作工作单元。你在与我们的表达式构建器相同的类型化、保留字安全的模型之上组装键条件、筛选和投影,并在旁边设置请求选项。输出不是片段,而是可以直接运行的程序 —— import、客户端初始化、调用本身,以及在启用“获取所有页”时,把每一页结果都取完的 ExclusiveStartKey 循环。

生成的代码对每个目标都保持诚实。AWS CLI 会自动分页,所以它的 Limit 变成 --page-size,单次请求运行则加上 --no-paginate;PartiQL 拒绝那些属于 ExecuteStatement API 而非语句本身的参数;降序 Query 在可表达时会变成对排序键的 ORDER BY。

只需要表达式本身 —— 六种操作中任意一种的条件、筛选或更新表达式及其占位符映射? DynamoDB 表达式构建器正是为此而生。 还在两种读取操作之间做选择? Query 与 Scan 对比 拆解了各自适用的场景。

常见问题

这与 DynamoDB 表达式构建器有什么不同?

两者刻意分工。表达式构建器关注表达式语法 —— 覆盖全部六种操作的键条件、筛选条件、更新表达式和条件表达式,以及它们的 ExpressionAttributeNames/Values 映射 —— 并只输出命令本身。查询构建器关注完整的 Query 或 Scan 请求:表和索引、键条件、筛选、投影,再加上表达式工具不提供的请求级参数(Limit、排序方向、ConsistentRead、ExclusiveStartKey),并输出一个带客户端初始化和可选分页循环的可运行程序。

在 Query 或 Scan 中,Limit 到底限制的是什么?

Limit 限制的是 DynamoDB 每次请求评估的项数,而不是你收到的匹配项数。筛选在读取之后执行,所以带 Limit 25 和 FilterExpression 的 Query 可能返回不足 25 个项 —— 甚至一个都没有 —— 却仍然消耗其评估的全部读取容量,分页则从 LastEvaluatedKey 继续。在会自动分页的 AWS CLI 中,同一参数通过 --page-size 设置。

DynamoDB 分页(LastEvaluatedKey)是如何工作的?

若 Query 或 Scan 的响应还有更多数据,其中会包含 LastEvaluatedKey——最后读取的那一项的主键。你在下一次请求中把它作为 ExclusiveStartKey 传回,如此反复,直到返回的响应不再包含它。开启“获取所有页”后,生成的 SDK v3、boto3、Java 和 .NET 程序中就包含这个循环;Go、Rust、Kotlin、PHP、Ruby 和 DocumentClient 使用各自 SDK 的原生分页器;AWS CLI 除非你传入 --no-paginate,否则会自行翻页。

什么时候可以使用强一致读取?

ConsistentRead 适用于基础表和本地二级索引,但不适用于全局二级索引 —— 对 GSI 发起并设置了 ConsistentRead 的 Query 会被拒绝。强一致读取消耗的读取容量也是最终一致读取的两倍。它是 API 参数,不属于 PartiQL 语句文本,所以 PartiQL 标签页会如实拒绝它。

我在这里输入的内容会被上传到任何地方吗?

不会。这是一个静态页面:请求的组装和代码的生成完全在你的浏览器中完成,表名、键值和筛选条件永远不会到达服务器。“复制链接”会把整个请求打包进 URL —— 分享该链接是你输入的内容离开页面的唯一途径,而这由你掌控。

无需控制台即可使用 DynamoDB

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

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