"Can Not Use Both Expression and Non-Expression Parameters": não é possível usar os dois

TL;DR — Sua solicitação definiu um parâmetro legado (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) e sua expressão equivalente (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) na mesma chamada. DynamoDB proíbe misturar as duas famílias. Remova o parâmetro herdado e use apenas expressões.

O que 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 possui duas gerações de parâmetros. A família herdada (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) é anterior às expressões; a família expression (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) o substituiu. Uma única solicitação deve ser comprometida com uma família - o guia do desenvolvedor é explícito que o DynamoDB "não permite misturar parâmetros condicionais herdados e parâmetros de expressão em uma única chamada", mesmo quando eles cobrem questões não relacionadas.

Por que isso acontece

  • Código semimigrado — você adicionou KeyConditionExpression, mas deixou um KeyConditions antigo no mesmo objeto de parâmetros.
  • Uma colisão de projeçãoAttributesToGet (legado) ao lado de ProjectionExpression.
  • Uma colisão de filtroScanFilter/QueryFilter ao lado de FilterExpression.
  • Uma colisão de gravaçãoExpected/AttributeUpdates junto com ConditionExpression/UpdateExpression.
  • Uma biblioteca auxiliar que injeta um padrão legado enquanto você define o formulário de expressão.

Como corrigir

  1. Exclua o parâmetro legado. Mantenha apenas o formato da expressão: KeyConditionExpression sobre KeyConditions, FilterExpression sobre ScanFilter/QueryFilter, ProjectionExpression sobre AttributesToGet, ConditionExpression/UpdateExpression sobre Expected/AttributeUpdates.
  2. Mover valores para espaços reservados — os valores embutidos legados tornam-se ExpressionAttributeValues (:v) e os nomes reservados /complex tornam-se ExpressionAttributeNames (#n).
  3. Auditoria de todo o objeto params — o conflito pode ser entre duas preocupações diferentes (por exemplo, projeção herdada + condição da chave de expressão), e não apenas a mesma.
  4. Prefira expressões em todos os lugares — AWS mantém os parâmetros legados apenas para compatibilidade com versões anteriores e recomenda os parâmetros de expressão para todos os novos códigos; padronizar expressões evita essa classe de erro.
  5. Retire os padrões herdados das bibliotecas auxiliares. Alguns wrappers do SDK ainda injetam AttributesToGet ou KeyConditions, a menos que você os desative explicitamente.

Execute no DynoTable

O painel de consulta do DynoTable usa apenas parâmetros de expressão – não existem campos legados KeyConditions ou ScanFilter nas solicitações geradas. Abra uma tabela com ⌘K, crie uma consulta ou varredura e copie o KeyConditionExpression emitido e os mapas de atributos em sua migração.

Use o Query Builder para criar o protótipo da solicitação somente de expressão antes de refatorar o código SDK antigo. A preparação (⌘S) permite testar a nova consulta em dados ativos sem confirmar escritas. Alternar perfis com ⌘P; configure-os em Configurações → Perfis com Conexão de teste. Consulte Conectar ao AWS e Instalar. Os parâmetros legados KeyConditions e ScanFilter não aparecem em nenhum lugar nas solicitações geradas pelo DynoTable. Se o wrapper do SDK ainda os injetar, registre o objeto de parâmetros completo e exclua todas as chaves herdadas antes que a chamada chegue ao DynamoDB.

Fontes

Erros relacionados

Referências

Última verificação em 13/07/2026 em relação à documentação oficial do AWS vinculada acima.

Trabalhe com o DynamoDB sem o Console

Um cliente desktop rápido para DynamoDB que roda o SQL de verdade que o DynamoDB não consegue — JOINs, GROUP BY, agregações — com edição visual e um agente de IA com suas próprias chaves do Bedrock.

Teste grátis de 30 dias, sem cartão de crédito — depois o plano Grátis sem limite de tempo.