ExpressionAttributeNames contiene una chiave non valida: errore di sintassi

TL;DR — Il problema è la chiave segnaposto sul lato sinistro della mappa ExpressionAttributeNames, non l'attributo a cui punta. Un segnaposto deve essere "#" seguito da semplici lettere, cifre o trattini bassi (#nome, #p0). Se inserisci il nome reale dell'attributo, con i suoi punti, trattini, segni + o spazi, nel segnaposto stesso, DynamoDB rifiuta la mappa. Mantieni i segnaposto noiosi; metti il vero nome disordinato sul lato destro.

Cosa significa

ValidationException: 1 validation error detected: ExpressionAttributeNames contains invalid key:
Syntax error; key: "#my.attribute"

# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: 1 validation error detected: ExpressionAttributeNames contains invalid key: Syntax error; key: "#my.attribute"

"ExpressionAttributeNames" mappa un token segnaposto (utilizzato all'interno dell'espressione) su un nome di attributo reale. DynamoDB convalida la sintassi del segnaposto prima di toccare i tuoi dati: deve iniziare con # e contenere solo caratteri validi all'interno di un token di espressione. I caratteri speciali che significano qualcosa nella grammatica dell'espressione — . (separatore del percorso), -, +, spazi — rendono il segnaposto stesso non analizzabile e l'intera richiesta viene rifiutata con questa ValidationException.

Perché succede

  • Il nome dell'attributo reale è stato copiato nel segnaposto — ad es. {"#stats.daily": "stats.daily"}. Il punto nella chiave è un errore di sintassi, indipendentemente da ciò a cui è associato.
  • Caratteri speciali nel segnaposto: trattini (#user-id), segni + o spazi. Solo i caratteri alfanumerici e i caratteri di sottolineatura sono sicuri dopo "#".
  • Un # mancante: le chiavi in ExpressionAttributeNames devono iniziare con #; {"name": "name"} non è valido.
  • Una libreria che genera automaticamente segnaposto dai nomi degli attributi che contengono punti o caratteri speciali, facendo passare il carattere direttamente.

Come risolverlo

  1. Utilizza semplici segnaposto e associa ciascuno al nome reale:

    {
      ExpressionAttributeNames: {'#p0': 'user-id', '#p1': 'stats'},
      KeyConditionExpression: '#p0 = :uid'
    }
  2. Per percorsi nidificati, alias ciascun segmento separatamente: un segnaposto per elemento del percorso, unito da un punto letterale nell'espressione:

    // read stats.daily where the item has a top-level "stats" map
    {
      ProjectionExpression: '#s.#d',
      ExpressionAttributeNames: {'#s': 'stats', '#d': 'daily'}
    }

    Nota il rovescio della medaglia: se il nome effettivo dell'attributo contiene un punto letterale (un attributo chiamato "stats.daily", non un percorso annidato), un singolo segnaposto per l'intero nome è esattamente quello che desideri — {'#sd': 'stats.daily'} — quindi il punto viene trattato come parte del nome, non come separatore di percorso.

  3. Controlla cosa genera il tuo wrapper: se un ODM/helper crea la mappa per te, registra la richiesta finale e controlla le chiavi segnaposto che ha prodotto.

  4. Non inserire mai separatori di percorso nelle chiavi segnaposto. I punti appartengono alla stringa dell'espressione tra i token "#segment" e non all'interno di una singola chiave "#".

Verificalo in DynoTable

DynoTable crea query con semplici segnaposto con prefisso #: i nomi degli attributi con punti, trattini o parole riservate hanno un alias corretto sul lato destro della mappa. Apri una tabella con ⌘K, aggiungi filtri e copia gli ExpressionAttributeNames generati.

Effettua un controllo incrociato dei nomi degli attributi nel controllo parole riservate quando scrivi alias a mano. Cambia profilo con ⌘P; vedere Connetti a AWS e Installa.

Fonti

Errori correlati

Riferimenti

Ultima verifica il 13-07-2026 rispetto alla documentazione ufficiale del 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.