入門閱讀時間 1 分鐘

用範例學 DynamoDB 的 PartiQL

是 DynamoDB 的 SQL 相容查詢語言。對於臨時性的工作,它比 原生 API 更好上手——但它跑在同一個引擎上,所以同一套索引鍵規則 (以及同樣的成本)在熟悉的語法底下依然適用。

你要怎麼為 DynamoDB 撰寫 PartiQL 查詢?

PartiQL 給了 DynamoDB 四個類 SQL 的陳述式——SELECTINSERTUPDATE、 以及 DELETE——透過 ExecuteStatement 執行。每一個底下都會編譯成一個原生 操作,所以在 上做過濾仍是一次 Query,而省略它就會變成一次全表 Scan。寫入依然是以 針對單一項目;沒有關聯式的 JOINGROUP BY 或彙總。

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", ?)

Parameters: [{ S: 'CUSTOMER#42' }, { S: 'ORDER#' }] 傳給 ExecuteStatement

批次與交易

  • BatchExecuteStatement — 一次來回最多 25 個陳述式。比較快, 但沒有跨項目的原子性(每一個各自成功或失敗)。
  • ExecuteTransaction — 最多 100 個陳述式,全有或全無。當 數個寫入必須一起提交時使用它。

PartiQL 的那顆地雷

PartiQL 看起來 像 SQL,但跑在 DynamoDB 引擎上,所以 SQL 的習慣會反咬你:

  • 單一個 UPDATE/DELETE 必須以完整的 針對 一個 項目—— 沒有 UPDATE … WHERE status = 'x' 這種批量更新(改用批次搭配迴圈)。
  • 沒有 JOIN、沒有 GROUP BY、沒有彙總COUNT/SUM/AVG)。見 PartiQL vs SQL
  • 省略分割區索引鍵會把任何 SELECT 變成一次全表 Scan——唯一的界限就是你的帳單。

當你真的需要 JOINGROUP BY 或彙總時,DynoTable 的 SQL Workbench 會在你拉出來的那些列上於用戶端執行它們——就是 PartiQL 說不出口的那種 SQL,且落在 DynamoDB 的存取模式規則之內。

PartiQL 並不會改變底層的 資料型別——值 在傳輸時仍以 DynamoDB-JSON 的形式傳送,你可以用 轉換器 來檢視。

試用 DynoTable,以具備結構感知自動完成的方式執行 PartiQL 陳述式, 並在可排序的資料表檢視中瀏覽結果。

已更新