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

  1. Basit yer tutucular kullanın ve her birini gerçek ada eşleyin:

    {
      ExpressionAttributeNames: {'#p0': 'user-id', '#p1': 'stats'},
      KeyConditionExpression: '#p0 = :uid'
    }
  2. 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.

  3. 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

References

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

Console olmadan DynamoDB ile çalışın

DynoTable, DynamoDB için hızlı bir masaüstü istemcisidir — tablolara göz atın, SQL tarzı sorgular çalıştırın ve item'ları yerel olarak düzenleyin.