ValidationException: Unexpected from source
TL;DR — 你 PartiQL FROM 子句中的表名包含了解析器不接受裸写的字符——通常是一个横线。把名称用双引号括起来(SELECT * FROM "my-table")。单引号不行:在 PartiQL 中它们表示一个字符串字面量,而不是一个标识符。
含义
ValidationException: Unexpected from sourcePartiQL 解析器把 FROM my-table 读作标识符 my 后跟意外的标记——横线在裸标识符内部无效。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 工作台,会为你处理好标识符加引号,而当你宁愿完全绕开 PartiQL 解析时,DynamoDB Expression Builder 会显示等价的原生 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 官方文档。