ExpressionAttributeNames contains invalid key: Syntax error
TL;DR — Sorun, işaret ettiği öznitelik değil, ExpressionAttributeNames map'inizin sol tarafındaki yer tutucu anahtarıdır. Bir yer tutucu, # ardından düz harfler, rakamlar ya da alt çizgiler (#name, #p0) olmalıdır. Gerçek öznitelik adını — noktaları, tireleri, + işaretleri ya da boşluklarıyla — yer tutucunun kendisine koyarsanız, DynamoDB map'i reddeder. Yer tutucuları sıkıcı tutun; dağınık gerçek adı sağ tarafa koyun.
Ne anlama gelir
ValidationException: ExpressionAttributeNames contains invalid key:
Syntax error; key: "#my.attribute"ExpressionAttributeNames, bir yer tutucu belirtecini (ifadenizin içinde kullanılır) gerçek bir öznitelik adına eşler. DynamoDB, verinize dokunmadan önce yer tutucunun söz dizimini doğrular: # ile başlamalı ve yalnızca bir ifade belirteci içinde geçerli olan karakterleri içermelidir. İfade dilbilgisinde bir anlam taşıyan özel karakterler — . (yol ayırıcısı), -, +, boşluklar — yer tutucunun kendisini ayrıştırılamaz hale getirir ve tüm istek bu ValidationException ile reddedilir.
Neden olur
- Gerçek öznitelik adı yer tutucuya kopyalandı — örneğin
{"#stats.daily": "stats.daily"}. Anahtardaki nokta, neye eşlendiğinden bağımsız olarak bir söz dizimi hatasıdır. - Yer tutucuda özel karakterler — tireler (
#user-id),+işaretleri ya da boşluklar.#'ten sonra yalnızca alfanümerikler ve alt çizgiler güvenlidir. - Eksik bir
#—ExpressionAttributeNames'teki anahtarlar#ile başlamalıdır;{"name": "name"}geçersizdir. - Nokta ya da özel karakterler içeren öznitelik adlarından yer tutucuları otomatik üreten bir kitaplık, karakteri doğrudan geçirir.
Nasıl düzeltilir
Basit yer tutucular kullanın ve her birini gerçek ada eşleyin:
{ ExpressionAttributeNames: {'#p0': 'user-id', '#p1': 'stats'}, KeyConditionExpression: '#p0 = :uid' }Yuvalanmış yollar için her segmenti ayrı ayrı takma adlandırın — yol öğesi başına bir yer tutucu, ifadede literal bir noktayla birleştirilir:
// read stats.daily where the item has a top-level "stats" map { ProjectionExpression: '#s.#d', ExpressionAttributeNames: {'#s': 'stats', '#d': 'daily'} }Diğer yüze dikkat edin: özniteliğin gerçek adı literal bir nokta içeriyorsa (yuvalanmış bir yol değil,
"stats.daily"adlı bir öznitelik), tüm ad için tek bir yer tutucu tam olarak istediğiniz şeydir —{'#sd': 'stats.daily'}— böylece nokta, bir yol ayırıcısı değil, adın parçası olarak ele alınır.Sarmalayıcınızın ne ürettiğini kontrol edin — bir ODM/yardımcı map'i sizin için oluşturuyorsa, son isteği günlüğe kaydedin ve ürettiği yer tutucu anahtarlarını inceleyin.
Adları noktalar ve tirelerle dolu özniteliklerle mi çalışıyorsunuz? DynoTable masaüstü uygulaması öznitelik ne olarak adlandırılırsa adlandırılsın, sorgularını düzgün takma adlandırılmış adlarla otomatik oluşturur.
İlgili hatalar
- Attribute name is a reserved keyword —
ExpressionAttributeNameskullanmanın diğer büyük nedeni. - Value provided in ExpressionAttributeNames unused in expressions
- Value provided in ExpressionAttributeValues unused
- Öğrenin: Expression names & values
References
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.