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
KeyConditionExpressionhinzugefügt, aber ein altesKeyConditionsam selben Params-Objekt gelassen. - Eine Projection-Kollision —
AttributesToGet(Legacy) nebenProjectionExpression. - Eine Filter-Kollision —
ScanFilter/QueryFilternebenFilterExpression. - Eine Write-Kollision —
Expected/AttributeUpdatesnebenConditionExpression/UpdateExpression. - Eine Helper-Bibliothek, die einen Legacy-Default einspeist, während du die Expression-Form setzt.
So behebst du es
- Lösche den Legacy-Parameter. Behalte nur die Expression-Form:
KeyConditionExpressionstattKeyConditions,FilterExpressionstattScanFilter/QueryFilter,ProjectionExpressionstattAttributesToGet,ConditionExpression/UpdateExpressionstattExpected/AttributeUpdates. - Verschiebe Werte in Platzhalter — Legacy-Inline-Werte werden zu
ExpressionAttributeValues(:v) und reservierte/komplexe Namen werden zuExpressionAttributeNames(#n). - Prüfe das gesamte Params-Objekt — der Konflikt kann zwischen zwei verschiedenen Belangen bestehen (z. B. Legacy-Projection + Expression-Key-Condition), nicht nur demselben.
- 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
- Legacy DynamoDB conditional parameters (verifiziert 2026-07-13)
- Query — Amazon DynamoDB API Reference (verifiziert 2026-07-13)
Verwandte Fehler
- Cannot specify projection when Select is COUNT — eine weitere gegenseitig ausschließende Parameterkombination.
- Query key condition not supported — ein fehlerhaftes
KeyConditionExpression. - Code example: Query in Node.js — eine Expression-only-Query zum Migrieren.
- Learn: Key-Condition-Expressions · Expression-Namen & -Werte
Referenzen
- 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
Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.