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 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。