ValidationException: Unexpected from source
TL;DR — 你 PartiQL FROM 子句中的表格名稱含有解析器不接受裸露形式的字元 — 通常是破折號。用雙引號包住名稱(SELECT * FROM "my-table")。單引號不行:在 PartiQL 中它們表示字串字面值,而非識別碼。
這是什麼意思
ValidationException: Unexpected from sourcePartiQL 解析器將 FROM my-table 讀為識別碼 my 後接非預期的 token — 破折號在裸露識別碼內無效。DynamoDB 表格名稱合法上可含 -、. 與 _,因此一個完全有效的表格名稱在 PartiQL 中仍可能無法解析,直到加上引號。同樣適用於與 PartiQL 關鍵字衝突的名稱。
為什麼會發生
- 表格名稱含破折號或點 —
users-prod、app.events。裸露識別碼無法攜帶它們。 - 框架產生的表格名稱 — 將環境或階段後綴加到表格名稱的工具(例如
Todo-dev)是破折號在你未選擇的情況下混入的經典方式。 - 查詢索引時未加引號 —
"table"."index"形式需要兩部分都加雙引號。 - 用單引號而非雙引號 —
FROM 'my-table'也會失敗:單引號在 PartiQL 中表示字串字面值,而非名稱。
如何修正
為表格名稱加雙引號:
SELECT * FROM "users-prod" WHERE pk = 'USER#42'查詢索引時為兩部分都加雙引號:
SELECT * FROM "users-prod"."email-index" WHERE email = 'ada@example.com'單引號只用於字串值 — 名稱用雙引號、值用單引號。混淆它們正好產生這類解析錯誤。
在產生的語句中防禦性地加引號 — 若你的程式碼將表格名稱內插到 PartiQL,總是以雙引號發出它們;即使名稱嚴格來說不需要也是有效的。
DynoTable 桌面應用程式隨附一個 DynamoDB 的 SQL workbench,為你處理識別碼引號,而 DynamoDB Expression Builder 在你寧願完全避開 PartiQL 解析時,顯示等效的原生 Query/Scan 請求。
相關錯誤
- DuplicateItemException — 對既有鍵的 PartiQL
INSERT。 - ValidationException — 父例外類別。
- 學習:PartiQL examples · SQL for DynamoDB
References
- PartiQL select statements for DynamoDB — Amazon DynamoDB Developer Guide
- Supported data types and naming rules in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。