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
KeyConditionExpressionma hai lasciato un vecchioKeyConditionssullo stesso oggetto params. - Una collisione di proiezione — "AttributesToGet" (legacy) insieme a "ProjectionExpression".
- Una collisione di filtri —
ScanFilter/QueryFilteraccanto aFilterExpression. - Una collisione di scrittura —
Expected/AttributeUpdatesinsieme aConditionExpression/UpdateExpression. - Una libreria di supporto che inserisce un valore predefinito legacy mentre imposti il modulo dell'espressione.
Come risolverlo
- Elimina il parametro legacy. Mantieni solo il formato dell'espressione:
KeyConditionExpressionsuKeyConditions,FilterExpressionsuScanFilter/QueryFilter,ProjectionExpressionsuAttributesToGet,ConditionExpression/UpdateExpressionsuExpected/AttributeUpdates. - Sposta i valori nei segnaposto: i valori in linea legacy diventano
ExpressionAttributeValues(:v) e i nomi riservati/complessi diventanoExpressionAttributeNames(#n). - 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.
- 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.
- Elimina le impostazioni predefinite legacy dalle librerie helper. Alcuni wrapper SDK inseriscono ancora
AttributesToGetoKeyConditionsa 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
- Parametri condizionali Legacy DynamoDB (verificato il 13-07-2026)
- Query: riferimento Amazon DynamoDB API (verificato il 13-07-2026)
Errori correlati
- Impossibile specificare la proiezione quando Select è COUNT: un'altra combinazione di parametri che si escludono a vicenda.
- Condizione della chiave di query non supportata — una
KeyConditionExpressionnon valida. - Esempio di codice: Query in Node.js: una query di sola espressione a cui migrare.
- Impara: Espressioni delle condizioni chiave · Nomi e valori delle espressioni
Riferimenti
Parametri condizionali Legacy DynamoDB - Guida per sviluppatori Amazon DynamoDB
Utilizzo delle espressioni in DynamoDB - Guida per sviluppatori di Amazon DynamoDB
Ultima verifica il 13-07-2026 rispetto alla documentazione ufficiale AWS collegata sopra.