DynamoDB "Can Not Use Both Expression and Non-Expression Parameters": no se pueden utilizar parámetros de expresión y no expresión

TL;DR: su solicitud establece un parámetro heredado (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) y su expresión equivalente (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) en la misma llamada. DynamoDB prohíbe mezclar las dos familias. Elimine el parámetro heredado y utilice únicamente expresiones.

Qué 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 tiene dos generaciones de parámetros. La familia legacy (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) precede a las expresiones; la familia de expresión (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) la reemplazó. Una sola petición debe comprometerse con una familia — la developer guide es explícita en que DynamoDB "does not allow mixing legacy conditional parameters and expression parameters in a single call", incluso cuando cubren aspectos no relacionados.

Por qué ocurre

  • Código a medio migrar — añadiste KeyConditionExpression pero dejaste un viejo KeyConditions en el mismo objeto de parámetros.
  • Una colisión de proyecciónAttributesToGet (legacy) junto a ProjectionExpression.
  • Una colisión de filtroScanFilter/QueryFilter junto a FilterExpression.
  • Una colisión de escrituraExpected/AttributeUpdates junto a ConditionExpression/UpdateExpression.
  • Una biblioteca helper que inyecta un valor por defecto legacy mientras tú estableces la forma de expresión.

Cómo solucionarlo

  1. Elimina el parámetro legacy. Conserva solo la forma de expresión: KeyConditionExpression sobre KeyConditions, FilterExpression sobre ScanFilter/QueryFilter, ProjectionExpression sobre AttributesToGet, ConditionExpression/UpdateExpression sobre Expected/AttributeUpdates.
  2. Mueve los valores a placeholders — los valores inline legacy pasan a ser ExpressionAttributeValues (:v) y los nombres reservados/complejos pasan a ser ExpressionAttributeNames (#n).
  3. Audita el objeto de parámetros completo — el conflicto puede darse entre dos aspectos distintos (p. ej. proyección legacy + condición de clave de expresión), no solo el mismo.
  4. Prefiere las expresiones en todas partes — AWS mantiene los parámetros legacy solo por retrocompatibilidad y recomienda los parámetros de expresión para todo el código nuevo; estandarizar en expresiones evita esta clase de error.
  5. Quita los valores por defecto legacy de las bibliotecas helper. Algunos wrappers de SDK siguen inyectando AttributesToGet o KeyConditions salvo que los desactives explícitamente.

Ejecútalo en DynoTable

El panel de consultas de DynoTable usa solo parámetros de expresión — en las peticiones generadas no existe ningún campo legacy KeyConditions ni ScanFilter. Abre una tabla con ⌘K, construye una Query o un Scan y copia el KeyConditionExpression y los mapas de atributos emitidos a tu migración.

Usa el Query Builder para prototipar la petición solo-expresión antes de refactorizar código antiguo del SDK. El área de preparación (⌘S) te permite probar la nueva consulta contra datos reales sin confirmar escrituras. Cambia de perfil con ⌘P; configúralos en Settings → Profiles con Test Connection. Consulta Conectar con AWS e Instalación. Los parámetros legacy KeyConditions y ScanFilter no aparecen en ninguna petición generada por DynoTable. Si tu wrapper del SDK sigue inyectándolos, registra el objeto de parámetros completo y elimina cada clave legacy antes de que la llamada llegue a DynamoDB.

Fuentes

Errores relacionados

Referencias

Verificado por última vez el 2026-07-13 contra la documentación oficial de AWS enlazada arriba.

Trabaja con DynamoDB sin la Consola

Un cliente de escritorio rápido para DynamoDB que ejecuta el SQL real que DynamoDB no puede — JOINs, GROUP BY, agregaciones — con edición visual y un agente de IA con tus propias claves de Bedrock.

Prueba gratuita de 30 días, sin tarjeta — después, el plan Free sin límite de tiempo.