DynamoDB "Can Not Use Both Expression and Non-Expression Parameters" — non può utilizzare sia parametri di espressione che non di espressione

TL;DR — La tua richiesta ha impostato un parametro legacy (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) e la sua espressione equivalente (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) nella stessa chiamata. DynamoDB vieta di mescolare le due famiglie. Rimuovi il parametro legacy e utilizza solo le espressioni.

Cosa significa

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 ha due generazioni di parametri. La famiglia legacy (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) è antecedente alle espressioni; la famiglia expression (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) l'ha sostituita. Una singola richiesta deve riguardare una famiglia: la guida per gli sviluppatori è esplicita nel dire che DynamoDB "non consente di mescolare parametri condizionali legacy e parametri di espressione in un'unica chiamata", anche quando coprono questioni non correlate.

Perché succede

  • Codice migrato a metà: hai aggiunto KeyConditionExpression ma hai lasciato un vecchio KeyConditions sullo stesso oggetto params.
  • Una collisione di proiezione — "AttributesToGet" (legacy) insieme a "ProjectionExpression".
  • Una collisione di filtriScanFilter/QueryFilter accanto a FilterExpression.
  • Una collisione di scritturaExpected/AttributeUpdates insieme a ConditionExpression/UpdateExpression.
  • Una libreria di supporto che inserisce un valore predefinito legacy mentre imposti il modulo dell'espressione.

Come risolverlo

  1. Elimina il parametro legacy. Mantieni solo il formato dell'espressione: KeyConditionExpression su KeyConditions, FilterExpression su ScanFilter/QueryFilter, ProjectionExpression su AttributesToGet, ConditionExpression/UpdateExpression su Expected/AttributeUpdates.
  2. Sposta i valori nei segnaposto: i valori in linea legacy diventano ExpressionAttributeValues (:v) e i nomi riservati/complessi diventano ExpressionAttributeNames (#n).
  3. Controlla l'intero oggetto params: il conflitto può essere tra due preoccupazioni diverse (ad esempio proiezione legacy + condizione chiave dell'espressione), non solo la stessa.
  4. Preferisci le espressioni ovunque — AWS mantiene i parametri legacy solo per compatibilità con le versioni precedenti e consiglia i parametri delle espressioni per tutto il nuovo codice; la standardizzazione delle espressioni evita questa classe di errori.
  5. Elimina le impostazioni predefinite legacy dalle librerie helper. Alcuni wrapper SDK inseriscono ancora AttributesToGet o KeyConditions a meno che non li disabiliti esplicitamente.

Eseguilo in DynoTable

Il pannello delle query di DynoTable utilizza solo parametri di espressione: non esistono campi KeyConditions o ScanFilter legacy nelle richieste generate. Apri una tabella con ⌘K, crea una query o una scansione e copia la KeyConditionExpression emessa e le mappe degli attributi nella tua migrazione.

Utilizza il Builder di query per prototipare la richiesta di sola espressione prima di eseguire il refactoring del vecchio codice SDK. La gestione temporanea (⌘S) consente di testare la nuova query rispetto ai dati in tempo reale senza eseguire operazioni di scrittura. Cambia profilo con ⌘P; configurarli in Impostazioni → Profili con Connessione di prova. Consulta Connetti a AWS e Installa. I parametri legacy KeyConditions e ScanFilter non compaiono da nessuna parte nelle richieste generate da DynoTable. Se il wrapper dell'SDK li inserisce ancora, registra l'oggetto params completo ed elimina ogni chiave legacy prima che la chiamata raggiunga DynamoDB.

Fonti

Errori correlati

Riferimenti

Ultima verifica il 13-07-2026 rispetto alla documentazione ufficiale AWS collegata sopra.

Lavora con DynamoDB senza la Console

Un client desktop veloce per DynamoDB che esegue il vero SQL che DynamoDB non può — JOINs, GROUP BY, aggregazioni — con modifica visuale e un agente AI sulle tue chiavi Bedrock.

Prova gratuita di 30 giorni, senza carta di credito — poi il piano Free senza limiti di tempo.