ExpressionAttributeNames contains invalid key: Syntax error
TL;DR — Das Problem ist der Platzhalter-Key auf der linken Seite deiner ExpressionAttributeNames-Map, nicht das Attribut, auf das er zeigt. Ein Platzhalter muss # gefolgt von einfachen Buchstaben, Ziffern oder Unterstrichen sein (#name, #p0). Steckst du den echten Attributnamen — mit Punkten, Bindestrichen, +-Zeichen oder Leerzeichen — in den Platzhalter selbst, lehnt DynamoDB die Map ab. Halte Platzhalter langweilig; der unhandliche echte Name gehört auf die rechte Seite.
Was es bedeutet
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 bildet ein Platzhalter-Token (das du innerhalb deiner Expression verwendest) auf einen echten Attributnamen ab. DynamoDB validiert die Syntax des Platzhalters, bevor es deine Daten anfasst: er muss mit # beginnen und darf nur Zeichen enthalten, die innerhalb eines Expression-Tokens gültig sind. Sonderzeichen, die in der Expression-Grammatik eine Bedeutung haben — . (Pfadtrenner), -, +, Leerzeichen — machen den Platzhalter selbst unparsbar, und die gesamte Anfrage wird mit dieser ValidationException zurückgewiesen.
Warum es passiert
- Der echte Attributname wurde in den Platzhalter kopiert — z. B.
{"#stats.daily": "stats.daily"}. Der Punkt im Schlüssel ist ein Syntaxfehler, egal worauf er abbildet. - Sonderzeichen im Platzhalter — Bindestriche (
#user-id),+-Zeichen oder Leerzeichen. Nur alphanumerische Zeichen und Unterstriche sind nach dem#sicher. - Ein fehlendes
#— Schlüssel inExpressionAttributeNamesmüssen mit#beginnen;{"name": "name"}ist ungültig. - Eine Bibliothek, die Platzhalter aus Attributnamen automatisch generiert, die Punkte oder Sonderzeichen enthalten, und das Zeichen direkt durchreicht.
So behebst du es
Nimm einfache Platzhalter und ordne jedem den echten Namen zu:
{ ExpressionAttributeNames: {'#p0': 'user-id', '#p1': 'stats'}, KeyConditionExpression: '#p0 = :uid' }Bei verschachtelten Pfaden aliasiere jedes Segment einzeln — ein Platzhalter pro Pfadelement, in der Expression durch einen echten Punkt verbunden:
// read stats.daily where the item has a top-level "stats" map { ProjectionExpression: '#s.#d', ExpressionAttributeNames: {'#s': 'stats', '#d': 'daily'} }Beachte die Kehrseite: Wenn der tatsächliche Name des Attributs einen echten Punkt enthält (ein Attribut namens
"stats.daily", kein verschachtelter Pfad), ist genau ein Platzhalter für den ganzen Namen richtig —{'#sd': 'stats.daily'}—, damit der Punkt als Teil des Namens gilt und nicht als Pfadtrenner.Prüfe, was dein Wrapper erzeugt — wenn ein ODM/Helper die Map für dich baut, logg den finalen Request und sieh dir die erzeugten Platzhalter-Keys an.
Steck nie Pfadtrenner in Platzhalter-Keys. Punkte gehören in den Expression-String zwischen
#segment-Tokens, nicht in einen einzelnen#-Key.
In DynoTable checken
DynoTable builds queries with simple #-prefixed placeholders — attribute names with dots, dashes, or reserved words are aliased correctly on the right side of the map. Öffne eine Tabelle mit ⌘K, add filters, and copy the generated ExpressionAttributeNames.
Cross-check attribute names in the reserved words checker wenn du hand-write aliases. Wechsle Profile mit ⌘P; see Mit AWS verbinden and Installation.
Quellen
- Expression attribute names (aliases) in DynamoDB (verifiziert 2026-07-13)
- Reserved words in DynamoDB (verifiziert 2026-07-13)
Verwandte Fehler
- Attribute name is a reserved keyword — der andere große Grund,
ExpressionAttributeNameszu verwenden. - Value provided in ExpressionAttributeNames unused in expressions
- Value provided in ExpressionAttributeValues unused
- Learn: Expression-Namen & -Werte
Referenzen
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
Zuletzt verifiziert am 2026-07-13 gegen die offizielle, oben verlinkte AWS-Dokumentation.