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: nameDynamoDB, 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ışıyor —
status,name,size,type,data,year,count,timestamp,source,regionve 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
ExpressionAttributeNamestakma adı gerektirir ve ilgili bir doğrulama hatası üretir.
Nasıl düzeltilir
- Adı
ExpressionAttributeNamesile 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'} }) ); - Bir yer tutucu, alfanümerikler/alt çizgi ile takip edilen bir
#ile başlamalıdır ve kullanılan her#nametanımlanmalıdır (ve tanımlanan her biri kullanılmalıdır). - 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.
- Literal nokta içeren adları tek bir yer tutucuyla takma adlandırın — literal olarak
Safety.Warningadlı 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
- Invalid UpdateExpression syntax — hatalı biçimlendirilmiş ifade yapısı.
- ValidationException (genel bakış)
- Kod örneği: UpdateItem in Node.js · Python (boto3) ile — #yer tutucularla takma adlandırılmış ayrılmış sözcükler.
- Öğrenin: Expression names & values · Update expressions
Kaynaklar
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
- Constraints in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.