Attribute name is a reserved keyword

TL;DR — Tu as utilisé un nom d'attribut qui est l'un des mots réservés de DynamoDB (il y en a ~570 — status, name, size, type, data, year, count, et bien d'autres) directement dans une expression. Remplace-le par un placeholder ExpressionAttributeNames#status mappé à status — et la requête passe.

Ce que ça signifie

ValidationException: 1 validation error detected: Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: status
ValidationException: 1 validation error detected: Invalid KeyConditionExpression: Attribute name is a reserved keyword; reserved keyword: name

DynamoDB maintient une liste de mots réservés qui ne peuvent pas apparaître littéralement dans une expression (UpdateExpression, ConditionExpression, FilterExpression, KeyConditionExpression, ProjectionExpression). Quand ton attribut se trouve être l'un d'eux, l'analyseur rejette l'expression. C'est une ValidationException (HTTP 400), non réessayable tant que tu n'as pas donné un alias au nom. Le message nomme le mot réservé exact.

Pourquoi ça arrive

  • Un nom d'attribut courant entre en collision avec un mot réservéstatus, name, size, type, data, year, count, timestamp, source, region, et des centaines d'autres sont réservés.
  • Une ProjectionExpression qui liste directement un nom d'attribut réservé.
  • Une FilterExpression/ConditionExpression référençant un nom réservé (#status = :s fonctionne ; status = :s non).
  • Un nom d'attribut qui commence par un chiffre, ou contient un espace, un point ou un tiret — ceux-ci nécessitent aussi un alias ExpressionAttributeNames, et produisent une erreur de validation liée.

Comment le corriger

  1. Donne un alias au nom avec ExpressionAttributeNames. Mappe un #placeholder au vrai nom et utilise le placeholder dans l'expression :
    await doc.send(
      new UpdateCommand({
        TableName: 'Orders',
        Key: {pk: 'ORDER#1'},
        UpdateExpression: 'SET #status = :s',
        ExpressionAttributeNames: {'#status': 'status'},
        ExpressionAttributeValues: {':s': 'shipped'}
      })
    );
  2. Un placeholder doit commencer par # suivi de caractères alphanumériques/underscore, et chaque #name utilisé doit être défini (et chaque défini utilisé).
  3. Donne des alias par précaution — donner un alias à chaque nom d'attribut dans tes expressions évite d'avoir à savoir quels mots sont réservés.
  4. Donne un alias aux noms contenant un point littéral avec un seul placeholder — un attribut littéralement nommé Safety.Warning a besoin d'un seul alias pour tout le nom ({'#sw': 'Safety.Warning'}), car un . sans alias est lu comme un séparateur de chemin de document. Pour un chemin réellement imbriqué, donne plutôt un alias à chaque segment (#pr.#5star).

FAQ

Comment corriger « Attribute name is a reserved keyword » dans DynamoDB ? Donne un alias à l'attribut avec ExpressionAttributeNames. Mappe un placeholder tel que #status au vrai nom « status » et utilise #status dans l'expression au lieu du mot littéral. Le placeholder doit commencer par # et chacun que tu définis doit être utilisé.

Quels noms d'attributs DynamoDB sont réservés ? Il y a environ 570 mots réservés, y compris des noms courants comme status, name, size, type, data, year, count, timestamp et region. Plutôt que de mémoriser la liste, donne un alias à chaque nom d'attribut dans tes expressions avec ExpressionAttributeNames.

Erreurs liées

Références

Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.