免费工具

DynamoDB 查询构建器

组装整个 Query 或 Scan 请求 —— 表、索引、键条件、筛选、投影、Limit、排序方向、一致性读取和分页 —— 并复制可运行的 AWS SDK v3、CLI 或 boto3 程序,或 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);

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

表达式很少是全部工作。生产环境的 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 程序正是包含这个循环;除非你传入 --no-paginate,AWS CLI 会自行翻页。

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

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

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

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

无需控制台即可使用 DynamoDB

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