入门阅读约 1 分钟

通过示例学习 DynamoDB 的 PartiQL

PartiQL 是一种兼容 SQL 的 DynamoDB 查询语言。在临时性工作中,它比原始 API 更友好 —— 但它运行在同一个引擎上,因此在熟悉的语法之下,同样的键规则(和同样的成本)依然适用。

SELECT

SELECT * FROM "AppData"
WHERE "PK" = 'CUSTOMER#42' AND begins_with("SK", 'ORDER#')

在分区键上做筛选,这就是一次 Query省略分区键,PartiQL 就会悄悄运行一次全表 Scan —— 同样的暗坑,只是藏在了 SELECT * 背后。

INSERT

INSERT INTO "AppData" VALUE {'PK': 'CUSTOMER#42', 'SK': 'PROFILE', 'plan': 'pro'}

UPDATE

UPDATE "AppData" SET "plan" = 'enterprise'
WHERE "PK" = 'CUSTOMER#42' AND "SK" = 'PROFILE'

DELETE

DELETE FROM "AppData"
WHERE "PK" = 'CUSTOMER#42' AND "SK" = 'ORDER#2026-001'

查询索引

FROM 子句中使用索引名:

SELECT * FROM "AppData"."GSI1" WHERE "GSI1PK" = 'STATUS#OPEN'

WHERE 还支持 INcontains()begins_with()

SELECT * FROM "AppData"
WHERE "PK" = 'CUSTOMER#42' AND "SK" IN ['ORDER#1', 'ORDER#2']

参数化语句

使用 ? 占位符,而不是把值内联进来 —— 它能规避引号/注入问题,并让 SDK 替你 marshal 类型:

SELECT * FROM "AppData" WHERE "PK" = ? AND begins_with("SK", ?)

ExecuteStatement 传入 Parameters: [{ S: 'CUSTOMER#42' }, { S: 'ORDER#' }]

批处理与事务

  • BatchExecuteStatement —— 一次往返最多 25 条语句。更快,但没有跨项原子性(每条各自成功或失败)。
  • ExecuteTransaction —— 最多 100 条语句,全部成功或全部失败。当多个写入必须一起提交时使用它。

PartiQL 的暗坑

PartiQL 看起来 像 SQL,但运行在 DynamoDB 引擎上,因此 SQL 习惯会反噬:

  • 单条 UPDATE/DELETE 必须按完整主键定位一个项 —— 没有 UPDATE … WHERE status = 'x' 这样的批量更新(改用批处理循环代替)。
  • 没有 JOIN、没有 GROUP BY、没有聚合函数COUNT/SUM/AVG)。参见 PartiQL 对比 SQL
  • 省略分区键会把任何 SELECT 变成一次全表 Scan —— 唯一的边界就是你的账单。

当你确实需要 JOINGROUP BY 或聚合时,DynoTable 的 SQL Workbench 会在客户端基于你已拉取的行运行它们 —— 这是 PartiQL 说不出口的 SQL,且仍在 DynamoDB 的访问模式规则之内。

PartiQL 并不改变底层的数据类型 —— 值仍以 DynamoDB-JSON 形式在传输中流动,你可以用转换器查看它。

试用 DynoTable,运行带自动补全的 PartiQL 语句,并查看每条语句消耗的读取单元。

更新于