ValidationException: Unexpected from source

TL;DR — 你 PartiQL FROM 子句中的表格名稱含有解析器不接受裸露形式的字元 — 通常是破折號。用雙引號包住名稱(SELECT * FROM "my-table")。單引號不行:在 PartiQL 中它們表示字串字面值,而非識別碼。

這是什麼意思

ValidationException: Unexpected from source

PartiQL 解析器將 FROM my-table 讀為識別碼 my 後接非預期的 token — 破折號在裸露識別碼內無效。DynamoDB 表格名稱合法上可含 -._,因此一個完全有效的表格名稱在 PartiQL 中仍可能無法解析,直到加上引號。同樣適用於與 PartiQL 關鍵字衝突的名稱。

為什麼會發生

  • 表格名稱含破折號或點users-prodapp.events。裸露識別碼無法攜帶它們。
  • 框架產生的表格名稱 — 將環境或階段後綴加到表格名稱的工具(例如 Todo-dev)是破折號在你未選擇的情況下混入的經典方式。
  • 查詢索引時未加引號"table"."index" 形式需要兩部分都加雙引號。
  • 用單引號而非雙引號FROM 'my-table' 也會失敗:單引號在 PartiQL 中表示字串字面值,而非名稱。

如何修正

  1. 為表格名稱加雙引號:

    SELECT * FROM "users-prod" WHERE pk = 'USER#42'
  2. 查詢索引時為兩部分都加雙引號:

    SELECT * FROM "users-prod"."email-index" WHERE email = 'ada@example.com'
  3. 單引號只用於字串值 — 名稱用雙引號、值用單引號。混淆它們正好產生這類解析錯誤。

  4. 在產生的語句中防禦性地加引號 — 若你的程式碼將表格名稱內插到 PartiQL,總是以雙引號發出它們;即使名稱嚴格來說不需要也是有效的。

DynoTable 桌面應用程式隨附一個 DynamoDB 的 SQL workbench,為你處理識別碼引號,而 DynamoDB Expression Builder 在你寧願完全避開 PartiQL 解析時,顯示等效的原生 Query/Scan 請求。

相關錯誤

References

最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。

不必透過主控台就能操作 DynamoDB

DynoTable 是一款快速的 DynamoDB 桌面用戶端 — 瀏覽表格、執行 SQL 風格的查詢,並在本機編輯項目。