DynamoDB — can not use both expression and non-expression parameters

TL;DR — 你的请求在同一次调用中同时设置了一个旧参数(KeyConditionsQueryFilterScanFilterAttributesToGetExpectedAttributeUpdatesConditionalOperator)和它的表达式等价物(KeyConditionExpressionFilterExpressionProjectionExpressionConditionExpressionUpdateExpression)。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 有两代参数。族(KeyConditionsQueryFilterScanFilterAttributesToGetExpectedAttributeUpdatesConditionalOperator)早于表达式;表达式族(KeyConditionExpressionFilterExpressionProjectionExpressionConditionExpressionUpdateExpression)取而代之。单个请求必须承诺使用其中一个族——开发者指南明确指出,DynamoDB"不允许在单次调用中混用旧的条件参数和表达式参数",即便它们覆盖的是互不相关的方面。

为什么会发生

  • 迁移了一半的代码——你添加了 KeyConditionExpression,却在同一个参数对象上留下了一个旧的 KeyConditions
  • 投影冲突——AttributesToGet(旧)与 ProjectionExpression 并存。
  • 过滤冲突——ScanFilter/QueryFilterFilterExpression 并存。
  • 写入冲突——Expected/AttributeUpdatesConditionExpression/UpdateExpression 并存。
  • 某个辅助库在你设置表达式形式时注入了一个旧的默认值。

如何修复

  1. 删除旧参数。 只保留表达式形式:用 KeyConditionExpression 取代 KeyConditionsFilterExpression 取代 ScanFilter/QueryFilterProjectionExpression 取代 AttributesToGetConditionExpression/UpdateExpression 取代 Expected/AttributeUpdates
  2. 把值移入占位符——旧的内联值变为 ExpressionAttributeValues:v),而保留字/复杂名称变为 ExpressionAttributeNames#n)。
  3. 审计整个参数对象——冲突可能发生在两个_不同_的方面之间(例如旧的投影 + 表达式键条件),而不只是同一方面。
  4. 处处优先使用表达式——AWS 仅出于向后兼容而保留旧参数,并推荐所有新代码使用表达式参数;统一到表达式可以避免这类错误。

在现代化旧的查询代码?先在 DynoTable 桌面应用里把仅用表达式的请求原型化,然后把生成的参数复制到你的应用中。

在 DynoTable 中运行

DynoTable 的查询面板仅使用表达式参数 - 生成的请求中不存在旧的 KeyConditionsScanFilter 字段。使用 ⌘K 打开表,构建 Query 或 Scan,然后将发出的 KeyConditionExpression 和属性映射复制到迁移中。在重构旧的 SDK 代码之前,使用 Query Builder 构建仅表达式请求的原型。暂存 (⌘S) 允许你针对实时数据测试新查询,而无需提交写入。使用 ⌘P 切换配置文件;在“设置”→“配置文件”下使用“Test Connection”配置它们。参见连接 AWS安装。旧版 KeyConditionsScanFilter 参数不会出现在 DynoTable 生成的请求中的任何位置。如果你的 SDK 包装器仍然注入它们,请记录完整的 params 对象并在调用到达 DynamoDB 之前删除每个旧密钥。

来源

相关错误

参考资料

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

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。