DynamoDB — can not use both expression and non-expression parameters
TL;DR — リクエストが レガシー パラメータ(KeyConditions、QueryFilter、ScanFilter、AttributesToGet、Expected、AttributeUpdates、ConditionalOperator)と その 式 版(KeyConditionExpression、FilterExpression、ProjectionExpression、ConditionExpression、UpdateExpression)を同じ呼び出しで設定しました。DynamoDB は2つのファミリーの混在を禁止します。レガシーパラメータを削除し、式だけを使ってください。
意味
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 には2世代のパラメータがあります。レガシー ファミリー(KeyConditions、QueryFilter、ScanFilter、AttributesToGet、Expected、AttributeUpdates、ConditionalOperator)は式より前のものです。式 ファミリー(KeyConditionExpression、FilterExpression、ProjectionExpression、ConditionExpression、UpdateExpression)がそれを置き換えました。1回のリクエストはどちらか一方のファミリーに統一する必要があります。開発者ガイドは、たとえ無関係な関心事をカバーする場合でも、DynamoDB が「1回の呼び出しでレガシー条件パラメータと式パラメータを混在させることを許可しない」と明記しています。
発生する理由
- 中途半端に移行したコード —
KeyConditionExpressionを追加したが、同じ params オブジェクトに古いKeyConditionsを残している。 - プロジェクションの衝突 —
AttributesToGet(レガシー)とProjectionExpressionの併用。 - フィルターの衝突 —
ScanFilter/QueryFilterとFilterExpressionの併用。 - 書き込みの衝突 —
Expected/AttributeUpdatesとConditionExpression/UpdateExpressionの併用。 - ヘルパーライブラリ が、あなたが式版を設定している間にレガシーのデフォルトを注入している。
修正方法
- レガシーパラメータを削除します。 式版のみを残します:
KeyConditionsよりKeyConditionExpression、ScanFilter/QueryFilterよりFilterExpression、AttributesToGetよりProjectionExpression、Expected/AttributeUpdatesよりConditionExpression/UpdateExpression。 - 値をプレースホルダーに移します — レガシーのインライン値は
ExpressionAttributeValues(:v)になり、予約語/複雑な名前はExpressionAttributeNames(#n)になります。 - params オブジェクト全体を監査します — 衝突は同じ関心事だけでなく、異なる 2つの関心事の間(例: レガシーのプロジェクション + 式のキー条件)でも起こり得ます。
- どこでも式を優先します — AWS はレガシーパラメータを後方互換性のためだけに残しており、すべての新しいコードには式パラメータを推奨しています。式に標準化することで、この種のエラーを回避できます。
古いクエリコードをモダナイズしていますか?まず DynoTable デスクトップアプリ で式のみのリクエストをプロトタイプし、生成されたパラメータをアプリにコピーしましょう。
DynoTable で実行する
DynoTable のクエリパネルは式パラメータだけを使います — 生成されるリクエストにレガシーの KeyConditions や ScanFilter フィールドは存在しません。⌘K でテーブルを開き、Query か Scan を組み立て、出力された KeyConditionExpression と属性マップを移行作業にコピーしてください。
古い SDK コードをリファクタリングする前に、クエリビルダーで式だけを使ったリクエストを試作しましょう。ステージング(⌘S)を使えば、書き込みをコミットせずに新しいクエリを実データに対して試せます。プロファイルの切り替えは ⌘P、設定は Settings → Profiles で行い、Test Connection を実行します。AWS に接続するとインストールを参照してください。レガシーの KeyConditions と ScanFilter パラメータは、DynoTable が生成するリクエストのどこにも現れません。自前の SDK ラッパーがまだそれらを差し込んでいるなら、params オブジェクト全体をログに出し、呼び出しが DynamoDB に届く前にレガシーなキーをすべて削除してください。
出典
- Legacy DynamoDB conditional parameters (2026-07-13 時点で検証)
- Query — Amazon DynamoDB API Reference (2026-07-13 時点で検証)
関連するエラー
- Cannot specify projection when Select is COUNT — もう1つの相互排他的なパラメータの組み合わせ。
- Query key condition not supported — 不正な形式の
KeyConditionExpression。 - Code example: Query in Node.js — 移行先となる式のみの Query。
- 学習: キー条件式 · 式属性名と値
参考資料
- Legacy DynamoDB conditional parameters — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- PutItem — Amazon DynamoDB API Reference
- Using expressions in DynamoDB — Amazon DynamoDB Developer Guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。