DynamoDB — can not use both expression and non-expression parameters
En bref — Ta requête a défini un paramètre hérité (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) et son équivalent expression (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) dans le même appel. DynamoDB interdit de mélanger les deux familles. Retire le paramètre hérité et utilise uniquement les expressions.
Ce que ça signifie
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 a deux générations de paramètres. La famille héritée (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) précède les expressions ; la famille expression (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) l'a remplacée. Une seule requête doit s'engager sur une seule famille — le guide développeur est explicite : DynamoDB « n'autorise pas le mélange de paramètres conditionnels hérités et de paramètres d'expression dans un seul appel », même quand ils couvrent des préoccupations sans rapport.
Pourquoi ça arrive
- Code à moitié migré — tu as ajouté
KeyConditionExpressionmais laissé un ancienKeyConditionssur le même objet de paramètres. - Une collision de projection —
AttributesToGet(hérité) aux côtés deProjectionExpression. - Une collision de filtre —
ScanFilter/QueryFilteraux côtés deFilterExpression. - Une collision d'écriture —
Expected/AttributeUpdatesaux côtés deConditionExpression/UpdateExpression. - Une bibliothèque utilitaire qui injecte une valeur héritée par défaut pendant que tu définis la forme expression.
Comment le corriger
- Supprime le paramètre hérité. Ne garde que la forme expression :
KeyConditionExpressionplutôt queKeyConditions,FilterExpressionplutôt queScanFilter/QueryFilter,ProjectionExpressionplutôt queAttributesToGet,ConditionExpression/UpdateExpressionplutôt queExpected/AttributeUpdates. - Déplace les valeurs dans des placeholders — les valeurs héritées en ligne deviennent des
ExpressionAttributeValues(:v) et les noms réservés/complexes deviennent desExpressionAttributeNames(#n). - Audite tout l'objet de paramètres — le conflit peut opposer deux préoccupations différentes (p. ex. projection héritée + condition de clé expression), pas seulement la même.
- Préfère les expressions partout — AWS ne conserve les paramètres hérités que pour la rétrocompatibilité et recommande les paramètres d'expression pour tout code nouveau ; standardiser sur les expressions évite cette classe d'erreur.
Tu modernises de l'ancien code de requête ? Prototype d'abord la requête tout-expression dans l'application de bureau DynoTable, puis copie les paramètres générés dans ton application.
Lance-le dans DynoTable
Le panneau de requête de DynoTable n'utilise que les paramètres d'expression — aucun champ KeyConditions ou ScanFilter hérité n'apparaît dans les requêtes générées. Ouvre une table avec ⌘K, construis une Query ou un Scan, et copie la KeyConditionExpression et les maps d'attributs émises dans ta migration.
Sers-toi du Query Builder pour prototyper la requête tout-expression avant de refactoriser ton vieux code SDK. Le staging (⌘S) te laisse tester la nouvelle requête sur des données en direct sans valider d'écriture. Change de profil avec ⌘P ; configure-les sous Settings → Profiles avec Test Connection. Vois Se connecter à AWS et Installation. Les paramètres hérités KeyConditions et ScanFilter n'apparaissent nulle part dans les requêtes générées par DynoTable. Si ton wrapper SDK les injecte encore, journalise l'objet params complet et supprime chaque clé héritée avant que l'appel n'atteigne DynamoDB.
Sources
- Legacy DynamoDB conditional parameters (vérifié le 2026-07-13)
- Query — Amazon DynamoDB API Reference (vérifié le 2026-07-13)
Erreurs liées
- Cannot specify projection when Select is COUNT — une autre combinaison de paramètres mutuellement exclusifs.
- Query key condition not supported — un
KeyConditionExpressionmal formé. - Exemple de code : Query en Node.js — une Query tout-expression vers laquelle migrer.
- Apprends : Key condition expressions · Expression names & values
Références
- 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
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.