DynamoDB — can not use both expression and non-expression parameters
TL;DR — 你的请求在同一次调用中同时设置了一个旧参数(KeyConditions、QueryFilter、ScanFilter、AttributesToGet、Expected、AttributeUpdates、ConditionalOperator)和它的表达式等价物(KeyConditionExpression、FilterExpression、ProjectionExpression、ConditionExpression、UpdateExpression)。DynamoDB 禁止混用这两个族。移除旧参数,只用表达式。
含义
ValidationException: Can not use both expression and non-expression parameters in
the same request: Non-expression parameters: {KeyConditions} Expression
parameters: {KeyConditionExpression}
# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: Can not use both expression and non-expression parameters in the same request: Non-expression parameters: {KeyConditions} Expression parameters: {KeyConditionExpression}DynamoDB 有两代参数。旧族(KeyConditions、QueryFilter、ScanFilter、AttributesToGet、Expected、AttributeUpdates、ConditionalOperator)早于表达式;表达式族(KeyConditionExpression、FilterExpression、ProjectionExpression、ConditionExpression、UpdateExpression)取而代之。单个请求必须承诺使用其中一个族——开发者指南明确指出,DynamoDB"不允许在单次调用中混用旧的条件参数和表达式参数",即便它们覆盖的是互不相关的方面。
为什么会发生
- 迁移了一半的代码——你添加了
KeyConditionExpression,却在同一个参数对象上留下了一个旧的KeyConditions。 - 投影冲突——
AttributesToGet(旧)与ProjectionExpression并存。 - 过滤冲突——
ScanFilter/QueryFilter与FilterExpression并存。 - 写入冲突——
Expected/AttributeUpdates与ConditionExpression/UpdateExpression并存。 - 某个辅助库在你设置表达式形式时注入了一个旧的默认值。
如何修复
- 删除旧参数。 只保留表达式形式:用
KeyConditionExpression取代KeyConditions,FilterExpression取代ScanFilter/QueryFilter,ProjectionExpression取代AttributesToGet,ConditionExpression/UpdateExpression取代Expected/AttributeUpdates。 - 把值移入占位符——旧的内联值变为
ExpressionAttributeValues(:v),而保留字/复杂名称变为ExpressionAttributeNames(#n)。 - 审计整个参数对象——冲突可能发生在两个_不同_的方面之间(例如旧的投影 + 表达式键条件),而不只是同一方面。
- 处处优先使用表达式——AWS 仅出于向后兼容而保留旧参数,并推荐所有新代码使用表达式参数;统一到表达式可以避免这类错误。
在现代化旧的查询代码?先在 DynoTable 桌面应用里把仅用表达式的请求原型化,然后把生成的参数复制到你的应用中。
在 DynoTable 中运行
DynoTable 的查询面板仅使用表达式参数 - 生成的请求中不存在旧的 KeyConditions 或 ScanFilter 字段。使用 ⌘K 打开表,构建 Query 或 Scan,然后将发出的 KeyConditionExpression 和属性映射复制到迁移中。在重构旧的 SDK 代码之前,使用 Query Builder 构建仅表达式请求的原型。暂存 (⌘S) 允许你针对实时数据测试新查询,而无需提交写入。使用 ⌘P 切换配置文件;在“设置”→“配置文件”下使用“Test Connection”配置它们。参见连接 AWS和安装。旧版 KeyConditions 和 ScanFilter 参数不会出现在 DynoTable 生成的请求中的任何位置。如果你的 SDK 包装器仍然注入它们,请记录完整的 params 对象并在调用到达 DynamoDB 之前删除每个旧密钥。
来源
- Legacy DynamoDB conditional parameters(2026-07-13 验证)
- Query — Amazon DynamoDB API Reference(2026-07-13 验证)
相关错误
- Cannot specify projection when Select is COUNT——另一种互斥的参数组合。
- Query key condition not supported——格式错误的
KeyConditionExpression。 - 代码示例:Query in Node.js——一个可迁移过去的仅用表达式的 Query。
- 学习:Key condition expressions · Expression names & values
参考资料
- Legacy DynamoDB conditional parameters — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- PutItem — Amazon DynamoDB API Reference
- Using expressions in DynamoDB — Amazon DynamoDB Developer Guide
最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。