以範例學習 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 也支援 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", ?)將 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 — 唯一的限制就是你的帳單。
當你真的需要 JOIN、GROUP BY 或聚合時,DynoTable 的 SQL Workbench 會在你拉取下來的列上於用戶端執行它們 — 這是 PartiQL 說不出口的 SQL,且仍在 DynamoDB 存取模式規則之內。
PartiQL 並不會改變底層的資料類型 — 值仍以 DynamoDB-JSON 的形式在線路上傳輸,你可以用轉換器檢查它。
試用 DynoTable,以自動完成執行 PartiQL 陳述式,並看到每一句所消耗的讀取單位。