ValidationException: Unexpected from source

TL;DR — 你 PartiQL FROM 子句中的表名包含了解析器不接受裸写的字符——通常是一个横线。把名称用双引号括起来(SELECT * FROM "my-table")。单引号不行:在 PartiQL 中它们表示一个字符串字面量,而不是一个标识符。

含义

ValidationException: Unexpected from source

PartiQL 解析器把 FROM my-table 读作标识符 my 后跟意外的标记——横线在裸标识符内部无效。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 工作台,会为你处理好标识符加引号,而当你宁愿完全绕开 PartiQL 解析时,DynamoDB Expression Builder 会显示等价的原生 Query/Scan 请求。

相关错误

References

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

无需控制台即可使用 DynamoDB

DynoTable 是面向 DynamoDB 的快速桌面客户端 —— 浏览表、运行 SQL 风格的查询,并在本地编辑项。