DynamoDB — The expression can not be empty

TL;DR — 你把一个表达式参数(FilterExpressionKeyConditionExpressionProjectionExpressionUpdateExpressionConditionExpression)作为空字符串 "" 传入了。DynamoDB 要求表达式参数要么是一个有效的非空表达式,要么完全不存在——空字符串是无效的。只在你确实有一个表达式时才包含该参数;否则省略该键。

含义

ValidationException: Invalid FilterExpression: The expression can not be empty;
ValidationException: Invalid KeyConditionExpression: The expression can not be empty;

DynamoDB 对空字符串的处理与省略参数不同。省略 FilterExpression 意味着"没有过滤器";传入 FilterExpression: "" 意味着"这里有一个过滤器"——然后没有东西可解析,因此验证失败。这适用于每一个表达式参数。

为什么会发生

  • 有条件构建的参数总是被设置——代码总是把 FilterExpression 附加到请求对象上,然后在没有选择过滤器时把它留作 ""
  • 一个辅助工具/ORM/连接器在过滤器列表为空时发出一个空表达式字符串,而不是丢掉该键。
  • 产生了空的字符串拼接——连接一个空的条件数组得到 ""
  • 被修剪掉的内容——占位符被剥离,留下一个空表达式。

如何修复

  1. 只在参数非空时才设置它。 有条件地构建参数对象:if (filter) params.FilterExpression = filter;——绝不赋 ""
  2. 在调用前删除空键——从请求中剥离任何值为空/空白字符串的表达式属性。
  3. 守护你的构建器——如果条件列表为空,就根本不附加表达式。
  4. 记住它们是独立的——当没有表达式使用它们时,ExpressionAttributeNames/Values 也应该被省略(而不是没有任何东西引用的 {})。
  5. 对于全表读取,一个没有 FilterExpressionScan 是正确的——省略该参数而不是传入一个空的。

在把查询接入代码之前原型化它们?在 DynoTable 桌面应用里运行它们——它只发送你实际填写的表达式参数,因此你不会交付一个空字符串过滤器。

在 DynoTable 中运行

DynoTable 仅发送你实际配置的表达式参数 - 空过滤器列表完全省略 FilterExpression 而不是传递 ""。使用⌘K打开一张表,在查询面板中添加过滤器,并在至少存在一个条件时复制生成的请求。在代码中连接条件参数之前,使用 Query Builder 对读取进行原型设计。暂存 (⌘S) 捕获更新时的空表达式错误。使用 ⌘P 切换配置文件; “设置”→“配置文件”上的“测试连接”确认目标表。参见连接 AWS安装。省略的参数和空字符串是不同的——只有后者才会触发此错误。

来源

相关错误

参考资料

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

无需控制台即可使用 DynamoDB

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

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