通过示例学习 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 还支持 IN、contains() 和 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 —— 唯一的边界就是你的账单。
当你确实需要 JOIN、GROUP BY 或聚合时,DynoTable 的 SQL Workbench 会在客户端基于你已拉取的行运行它们 —— 这是 PartiQL 说不出口的 SQL,且仍在 DynamoDB 的访问模式规则之内。
PartiQL 并不改变底层的数据类型 —— 值仍以 DynamoDB-JSON 形式在传输中流动,你可以用转换器查看它。
试用 DynoTable,运行带自动补全的 PartiQL 语句,并查看每条语句消耗的读取单元。