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

TL;DR — Dein Request hat im selben Aufruf einen Legacy-Parameter (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) und sein Expression-Gegenstück (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) gesetzt. DynamoDB verbietet es, die beiden Familien zu mischen. Entferne den Legacy-Parameter und nimm nur noch Expressions.

Was es bedeutet

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 hat zwei Generationen von Parametern. Die Legacy-Familie (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) ist älter als Expressions; die Expression-Familie (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) hat sie abgelöst. Eine einzelne Anfrage muss sich auf eine Familie festlegen — der Developer Guide ist eindeutig, dass DynamoDB „does not allow mixing legacy conditional parameters and expression parameters in a single call", selbst wenn sie unabhängige Belange abdecken.

Warum es passiert

  • Halb migrierter Code — du hast KeyConditionExpression hinzugefügt, aber ein altes KeyConditions am selben Params-Objekt gelassen.
  • Eine Projection-KollisionAttributesToGet (Legacy) neben ProjectionExpression.
  • Eine Filter-KollisionScanFilter/QueryFilter neben FilterExpression.
  • Eine Write-KollisionExpected/AttributeUpdates neben ConditionExpression/UpdateExpression.
  • Eine Helper-Bibliothek, die einen Legacy-Default einspeist, während du die Expression-Form setzt.

So behebst du es

  1. Lösche den Legacy-Parameter. Behalte nur die Expression-Form: KeyConditionExpression statt KeyConditions, FilterExpression statt ScanFilter/QueryFilter, ProjectionExpression statt AttributesToGet, ConditionExpression/UpdateExpression statt Expected/AttributeUpdates.
  2. Verschiebe Werte in Platzhalter — Legacy-Inline-Werte werden zu ExpressionAttributeValues (:v) und reservierte/komplexe Namen werden zu ExpressionAttributeNames (#n).
  3. Prüfe das gesamte Params-Objekt — der Konflikt kann zwischen zwei verschiedenen Belangen bestehen (z. B. Legacy-Projection + Expression-Key-Condition), nicht nur demselben.
  4. Bevorzuge Expressions überall — AWS behält die Legacy-Parameter nur zur Abwärtskompatibilität und empfiehlt die Expression-Parameter für allen neuen Code; die Standardisierung auf Expressions vermeidet diese Fehlerklasse.

Alten Query-Code modernisieren? Prototype die Expression-only-Anfrage zuerst in der DynoTable-Desktop-App und kopiere dann die erzeugten Parameter in deine App.

In DynoTable ausführen

DynoTable's query panel nutzt nur Expression-Parameter — keine legacy KeyConditions- oder ScanFilter-Felder in generierten Requests. Öffne eine Tabelle mit ⌘K, baue eine Query oder einen Scan, and kopiere die emittierte KeyConditionExpression und Attribut-Maps in deine Migration.

Nutze den Query Builder to prototype the expression-only request bevor du refactor old SDK code. Staging (⌘S) lässt dich die neue Query gegen Live-Daten testen, ohne Writes zu committen. Wechsle Profile mit ⌘P; konfiguriere sie unter Einstellungen → Profile mit Verbindung testen. Siehe Mit AWS verbinden und Installation. Legacy-KeyConditions- und ScanFilter-Parameter erscheinen nirgends in DynoTable-generierten Requests. Wenn your SDK wrapper still injects them, log the full params object and delete every legacy key before the call reaches DynamoDB.

Quellen

Verwandte Fehler

Referenzen

Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.

Mit DynamoDB ohne die Console arbeiten

Ein schneller DynamoDB-Desktop-Client, der das echte SQL ausführt, das DynamoDB nicht kann — JOINs, GROUP BY, Aggregationen — mit visueller Bearbeitung und einem KI-Agenten auf deinen eigenen Bedrock-Schlüsseln.

30 Tage kostenlos testen, keine Kreditkarte — danach der Kostenlos-Tarif ohne Zeitlimit.