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/コネクタ。
- 何も生まなかった文字列連結 — 空の条件配列を結合すると
""になる。 - 削られたコンテンツ — プレースホルダーが取り除かれ、空の式が残った。
修正方法
- 空でないときのみパラメータを設定します。 params オブジェクトを条件付きで組み立てます:
if (filter) params.FilterExpression = filter;— 決して""を代入しないでください。 - 呼び出し前に空のキーを削除します — 値が空/空白の文字列である式プロパティをリクエストから取り除きます。
- ビルダーをガードします — 条件のリストが空なら、式をまったく付けないでください。
- それらが独立していることを忘れないでください — それらを使う式がないとき、
ExpressionAttributeNames/Valuesも省略します(何にも参照されない{}ではなく)。 - テーブル全体の読み取りには、
FilterExpressionなしのScanが正しいです。空のものを渡すのではなく、パラメータを省略します。
コードに組み込む前にクエリをプロトタイプしていますか?DynoTable デスクトップアプリ で実行しましょう。実際に入力した式パラメータのみを送るため、空文字列のフィルターを出荷することはありません。
関連するエラー
- Query key condition not supported — 空ではない不正な形式の
KeyConditionExpression。 - Invalid UpdateExpression syntax — 空ではないが不正な形式の更新式。
- Learn: Filtering strategies · Key condition expressions
References
- 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 ドキュメントに照らして確認しました。