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

TL;DR — 你的請求在同一次呼叫中同時設定了一箇舊引數(KeyConditionsQueryFilterScanFilterAttributesToGetExpectedAttributeUpdatesConditionalOperator)和它的運算式等價物(KeyConditionExpressionFilterExpressionProjectionExpressionConditionExpressionUpdateExpression)。DynamoDB 禁止混用這兩個族。移除舊引數,只用運算式。

這是什麼意思

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 有兩代引數。族(KeyConditionsQueryFilterScanFilterAttributesToGetExpectedAttributeUpdatesConditionalOperator)早於運算式;運算式族(KeyConditionExpressionFilterExpressionProjectionExpressionConditionExpressionUpdateExpression)取而代之。單個請求必須承諾使用其中一個族——開發者指南明確指出,DynamoDB"不允許在單次呼叫中混用舊的條件引數和運算式引數",即便它們覆蓋的是互不相關的方面。

為什麼會發生

  • 遷移了一半的程式碼——你新增了 KeyConditionExpression,卻在同一個引數物件上留下了一箇舊的 KeyConditions
  • 投影衝突——AttributesToGet(舊)與 ProjectionExpression 並存。
  • 過濾衝突——ScanFilter/QueryFilterFilterExpression 並存。
  • 寫入衝突——Expected/AttributeUpdatesConditionExpression/UpdateExpression 並存。
  • 某個輔助庫在你設定運算式形式時注入了一箇舊的預設值。

如何修正

  1. 刪除舊引數。 只保留運算式形式:用 KeyConditionExpression 取代 KeyConditionsFilterExpression 取代 ScanFilter/QueryFilterProjectionExpression 取代 AttributesToGetConditionExpression/UpdateExpression 取代 Expected/AttributeUpdates
  2. 把值移入預留位置——舊的內聯值變為 ExpressionAttributeValues:v),而保留字/複雜名稱變為 ExpressionAttributeNames#n)。
  3. 審計整個引數物件——衝突可能發生在兩個_不同_的方面之間(例如舊的投影 + 運算式鍵條件),而不只是同一方面。
  4. 處處優先使用運算式——AWS 僅出於向後相容而保留舊引數,並推薦所有新程式碼使用運算式引數;統一到運算式可以避免這類錯誤。

在現代化舊的查詢程式碼?先在 DynoTable 桌面應用裡把僅用運算式的請求原型化,然後把生成的引數複製到你的應用中。

在 DynoTable 中執行

DynoTable 的查詢面板僅使用運算式引數 - 生成的請求中不存在舊的 KeyConditionsScanFilter 欄位。使用 ⌘K 開啟表,構建 Query 或 Scan,然後將發出的 KeyConditionExpression 和屬性對映覆制到遷移中。在重構舊的 SDK 程式碼之前,使用 Query Builder 構建僅運算式請求的原型。暫存 (⌘S) 允許你針對實時資料測試新查詢,而無需提交寫入。使用 ⌘P 切換設定檔案;在“設定”→“設定檔案”下使用“Test Connection”配置它們。參見連線 AWS安裝。舊版 KeyConditionsScanFilter 引數不會出現在 DynoTable 生成的請求中的任何位置。如果你的 SDK 包裝器仍然注入它們,請記錄完整的 params 物件並在呼叫到達 DynamoDB 之前刪除每個舊金鑰。

來源

相關錯誤

參考資料

最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

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