DynamoDB — The expression can not be empty
TL;DR — 你把一個運算式引數(FilterExpression、KeyConditionExpression、ProjectionExpression、UpdateExpression 或 ConditionExpression)作為空字串 "" 傳入了。DynamoDB 要求運算式引數要麼是一個有效的非空運算式,要麼完全不存在——空字串是無效的。只在你確實有一個運算式時才包含該引數;否則省略該鍵。
這是什麼意思
ValidationException: Invalid FilterExpression: The expression can not be empty;
ValidationException: Invalid KeyConditionExpression: The expression can not be empty;DynamoDB 對空字串的處理與省略引數不同。省略 FilterExpression 意味著"沒有過濾器";傳入 FilterExpression: "" 意味著"這裡有一個過濾器"——然後沒有東西可解析,因此驗證失敗。這適用於每一個運算式引數。
為什麼會發生
- 有條件構建的引數總是被設定——程式碼總是把
FilterExpression附加到請求物件上,然後在沒有選擇過濾器時把它留作""。 - 一個輔助工具/ORM/聯結器在過濾器列表為空時發出一個空運算式字串,而不是丟掉該鍵。
- 產生了空的字串拼接——連線一個空的條件陣列得到
""。 - 被修剪掉的內容——預留位置被剝離,留下一個空運算式。
如何修正
- 只在引數非空時才設定它。 有條件地構建引數物件:
if (filter) params.FilterExpression = filter;——絕不賦""。 - 在呼叫前刪除空鍵——從請求中剝離任何值為空/空白字串的運算式屬性。
- 守護你的構建器——如果條件列表為空,就根本不附加運算式。
- 記住它們是獨立的——當沒有運算式使用它們時,
ExpressionAttributeNames/Values也應該被省略(而不是沒有任何東西引用的{})。 - 對於全表讀取,一個沒有
FilterExpression的Scan是正確的——省略該引數而不是傳入一個空的。
在把查詢接入程式碼之前原型化它們?在 DynoTable 桌面應用裡執行它們——它只傳送你實際填寫的運算式引數,因此你不會交付一個空字串過濾器。
在 DynoTable 中執行
DynoTable 僅傳送你實際配置的運算式引數 - 空過濾器列表完全省略 FilterExpression 而不是傳遞 ""。使用⌘K開啟一張表,在查詢面板中新增過濾器,並在至少存在一個條件時複製生成的請求。在程式碼中連線條件引數之前,使用 Query Builder 對讀取進行原型設計。暫存 (⌘S) 捕獲更新時的空運算式錯誤。使用 ⌘P 切換設定檔案; “設定”→“設定檔案”上的“測試連線”確認目標表。參見連線 AWS和安裝。省略的引數和空字串是不同的——只有後者才會觸發此錯誤。
來源
- Using expressions in DynamoDB(2026-07-13 驗證)
- Query — Amazon DynamoDB API Reference(2026-07-13 驗證)
相關錯誤
- Query key condition not supported——一個格式錯誤(而非空)的
KeyConditionExpression。 - Invalid UpdateExpression 語法——一個非空但格式錯誤的更新運算式。
- 學習:Filtering strategies · Key condition expressions
參考資料
- Using expressions in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Scan — Amazon DynamoDB API Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。