DynamoDB — can not use both expression and non-expression parameters

TL;DR — リクエストが レガシー パラメータ(KeyConditionsQueryFilterScanFilterAttributesToGetExpectedAttributeUpdatesConditionalOperator)と その 式 版(KeyConditionExpressionFilterExpressionProjectionExpressionConditionExpressionUpdateExpression)を同じ呼び出しで設定しました。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世代のパラメータがあります。レガシー ファミリー(KeyConditionsQueryFilterScanFilterAttributesToGetExpectedAttributeUpdatesConditionalOperator)は式より前のものです。 ファミリー(KeyConditionExpressionFilterExpressionProjectionExpressionConditionExpressionUpdateExpression)がそれを置き換えました。1回のリクエストはどちらか一方のファミリーに統一する必要があります。開発者ガイドは、たとえ無関係な関心事をカバーする場合でも、DynamoDB が「1回の呼び出しでレガシー条件パラメータと式パラメータを混在させることを許可しない」と明記しています。

発生する理由

  • 中途半端に移行したコードKeyConditionExpression を追加したが、同じ params オブジェクトに古い KeyConditions を残している。
  • プロジェクションの衝突AttributesToGet(レガシー)と ProjectionExpression の併用。
  • フィルターの衝突ScanFilter/QueryFilterFilterExpression の併用。
  • 書き込みの衝突Expected/AttributeUpdatesConditionExpression/UpdateExpression の併用。
  • ヘルパーライブラリ が、あなたが式版を設定している間にレガシーのデフォルトを注入している。

修正方法

  1. レガシーパラメータを削除します。 式版のみを残します: KeyConditions より KeyConditionExpressionScanFilter/QueryFilter より FilterExpressionAttributesToGet より ProjectionExpressionExpected/AttributeUpdates より ConditionExpression/UpdateExpression
  2. 値をプレースホルダーに移します — レガシーのインライン値は ExpressionAttributeValues:v)になり、予約語/複雑な名前は ExpressionAttributeNames#n)になります。
  3. params オブジェクト全体を監査します — 衝突は同じ関心事だけでなく、異なる 2つの関心事の間(例: レガシーのプロジェクション + 式のキー条件)でも起こり得ます。
  4. どこでも式を優先します — AWS はレガシーパラメータを後方互換性のためだけに残しており、すべての新しいコードには式パラメータを推奨しています。式に標準化することで、この種のエラーを回避できます。

古いクエリコードをモダナイズしていますか?まず DynoTable デスクトップアプリ で式のみのリクエストをプロトタイプし、生成されたパラメータをアプリにコピーしましょう。

DynoTable で実行する

DynoTable のクエリパネルは式パラメータだけを使います — 生成されるリクエストにレガシーの KeyConditionsScanFilter フィールドは存在しません。⌘K でテーブルを開き、Query か Scan を組み立て、出力された KeyConditionExpression と属性マップを移行作業にコピーしてください。

古い SDK コードをリファクタリングする前に、クエリビルダーで式だけを使ったリクエストを試作しましょう。ステージング(⌘S)を使えば、書き込みをコミットせずに新しいクエリを実データに対して試せます。プロファイルの切り替えは ⌘P、設定は Settings → Profiles で行い、Test Connection を実行します。AWS に接続するインストールを参照してください。レガシーの KeyConditionsScanFilter パラメータは、DynoTable が生成するリクエストのどこにも現れません。自前の SDK ラッパーがまだそれらを差し込んでいるなら、params オブジェクト全体をログに出し、呼び出しが DynamoDB に届く前にレガシーなキーをすべて削除してください。

出典

関連するエラー

参考資料

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。