入門閱讀時間 1 分鐘

以範例學習 DynamoDB 的 PartiQL

PartiQL 是與 SQL 相容的 DynamoDB 查詢語言。對於臨時性的工作,它比原始 API 更友善 — 但它跑在同一個引擎上,因此在這些熟悉的語法底下,相同的鍵規則(與相同的成本)依然適用。

SELECT

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

對 partition key 進行篩選,這就是一個 Query省略 partition key,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 與 SQL 的比較
  • 省略 partition key 會把任何 SELECT 變成一次全表 Scan — 唯一的限制就是你的帳單。

當你真的需要 JOINGROUP BY 或聚合時,DynoTable 的 SQL Workbench 會在你拉取下來的列上於用戶端執行它們 — 這是 PartiQL 說不出口的 SQL,且仍在 DynamoDB 存取模式規則之內。

PartiQL 並不會改變底層的資料類型 — 值仍以 DynamoDB-JSON 的形式在線路上傳輸,你可以用轉換器檢查它。

試用 DynoTable,以自動完成執行 PartiQL 陳述式,並看到每一句所消耗的讀取單位。

已更新