Attribute name is a reserved keyword

TL;DR — DynamoDB'nin ayrılmış sözcüklerinden biri olan bir öznitelik adını (~570 tane var — status, name, size, type, data, year, count ve çok daha fazlası) doğrudan bir ifadede kullandınız. Onu bir ExpressionAttributeNames yer tutucusuyla değiştirin — status'a eşlenmiş #status — ve istek geçer.

Ne anlama gelir

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, bir ifadede (UpdateExpression, ConditionExpression, FilterExpression, KeyConditionExpression, ProjectionExpression) literal olarak görünemeyen ayrılmış sözcüklerin bir listesini tutar. Özniteliğiniz onlardan biri olduğunda, ayrıştırıcı ifadeyi reddeder. Bu, adı takma adlandırana kadar yeniden denenebilir olmayan bir ValidationException'dır (HTTP 400). Mesaj, tam ayrılmış sözcüğü adıyla verir.

Neden olur

  • Yaygın bir öznitelik adı bir ayrılmış sözcükle çakışıyorstatus, name, size, type, data, year, count, timestamp, source, region ve yüzlercesi ayrılmıştır.
  • Ayrılmış bir öznitelik adını doğrudan listeleyen bir ProjectionExpression.
  • Ayrılmış bir ada başvuran bir FilterExpression/ConditionExpression (#status = :s çalışır; status = :s çalışmaz).
  • Bir sayıyla başlayan ya da bir boşluk, nokta veya tire içeren bir öznitelik adı — bunlar da bir ExpressionAttributeNames takma adı gerektirir ve ilgili bir doğrulama hatası üretir.

Nasıl düzeltilir

  1. Adı ExpressionAttributeNames ile takma adlandırın. Bir #placeholder'ı gerçek ada eşleyin ve ifadede yer tutucuyu kullanın:
    await doc.send(
      new UpdateCommand({
        TableName: 'Orders',
        Key: {pk: 'ORDER#1'},
        UpdateExpression: 'SET #status = :s',
        ExpressionAttributeNames: {'#status': 'status'},
        ExpressionAttributeValues: {':s': 'shipped'}
      })
    );
  2. Bir yer tutucu, alfanümerikler/alt çizgi ile takip edilen bir # ile başlamalıdır ve kullanılan her #name tanımlanmalıdır (ve tanımlanan her biri kullanılmalıdır).
  3. Savunmacı takma adlandırın — ifadelerinizdeki her öznitelik adını takma adlandırmak, hangi sözcüklerin ayrılmış olduğunu bilmek zorunda kalmayı önler.
  4. Literal nokta içeren adları tek bir yer tutucuyla takma adlandırın — literal olarak Safety.Warning adlı bir öznitelik, tüm ad için bir takma ada ({'#sw': 'Safety.Warning'}) ihtiyaç duyar, çünkü takma adlandırılmamış bir . bir belge-yolu ayırıcısı olarak okunur. Gerçekten yuvalanmış bir yol için bunun yerine her segmenti takma adlandırın (#pr.#5star).

SSS

DynamoDB'de "Attribute name is a reserved keyword"u nasıl düzeltirim? Özniteliği ExpressionAttributeNames ile takma adlandırın. #status gibi bir yer tutucuyu gerçek ad "status"a eşleyin ve ifadede literal sözcük yerine #status kullanın. Yer tutucu # ile başlamalı ve tanımladığınız her biri kullanılmalıdır.

Hangi DynamoDB öznitelik adları ayrılmıştır? status, name, size, type, data, year, count, timestamp ve region gibi gündelik adlar dahil, yaklaşık 570 ayrılmış sözcük vardır. Listeyi ezberlemek yerine, ifadelerinizdeki her öznitelik adını ExpressionAttributeNames ile takma adlandırın.

İlgili hatalar

Kaynaklar

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalış

DynamoDB’nin çalıştıramadığı gerçek SQL’i çalıştıran hızlı bir DynamoDB masaüstü istemcisi — JOINs, GROUP BY, toplamalar — görsel düzenleme ve kendi Bedrock anahtarların üzerinde bir yapay zekâ aracısıyla.

30 günlük ücretsiz deneme, kredi kartı yok — ardından süre sınırı olmayan Ücretsiz plan.