ExpressionAttributeNames contains invalid key: Syntax error
TL;DR — Masalahnya adalah kunci placeholder di sisi kiri map ExpressionAttributeNames Anda, bukan atribut yang ditunjuknya. Sebuah placeholder harus # diikuti huruf, digit, atau underscore biasa (#name, #p0). Jika Anda memasukkan nama atribut yang sebenarnya — dengan titik, tanda hubung, tanda +, atau spasi — ke placeholder itu sendiri, DynamoDB menolak map. Jaga placeholder tetap membosankan; letakkan nama sebenarnya yang berantakan di sisi kanan.
Apa artinya
ValidationException: ExpressionAttributeNames contains invalid key:
Syntax error; key: "#my.attribute"ExpressionAttributeNames memetakan token placeholder (digunakan di dalam expression Anda) ke nama atribut yang sebenarnya. DynamoDB memvalidasi sintaks placeholder sebelum menyentuh data Anda: ia harus dimulai dengan # dan hanya berisi karakter yang valid di dalam token expression. Karakter khusus yang berarti sesuatu dalam tata bahasa expression — . (pemisah path), -, +, spasi — membuat placeholder itu sendiri tidak dapat di-parse, dan seluruh permintaan ditolak dengan ValidationException ini.
Mengapa terjadi
- Nama atribut sebenarnya disalin ke placeholder — mis.
{"#stats.daily": "stats.daily"}. Titik di kunci adalah syntax error, terlepas dari apa yang dipetakannya. - Karakter khusus dalam placeholder — tanda hubung (
#user-id), tanda+, atau spasi. Hanya alfanumerik dan underscore yang aman setelah#. #yang hilang — kunci diExpressionAttributeNamesharus dimulai dengan#;{"name": "name"}tidak valid.- Library menghasilkan placeholder otomatis dari nama atribut yang berisi titik atau karakter khusus, meneruskan karakter itu langsung.
Cara memperbaikinya
Gunakan placeholder sederhana dan petakan masing-masing ke nama sebenarnya:
{ ExpressionAttributeNames: {'#p0': 'user-id', '#p1': 'stats'}, KeyConditionExpression: '#p0 = :uid' }Untuk path bersarang, alias setiap segmen secara terpisah — satu placeholder per elemen path, digabung dengan titik literal dalam expression:
// read stats.daily where the item has a top-level "stats" map { ProjectionExpression: '#s.#d', ExpressionAttributeNames: {'#s': 'stats', '#d': 'daily'} }Perhatikan sisi sebaliknya: jika nama sebenarnya atribut berisi titik literal (satu atribut bernama
"stats.daily", bukan path bersarang), placeholder tunggal untuk seluruh nama adalah persis yang Anda inginkan —{'#sd': 'stats.daily'}— jadi titik diperlakukan sebagai bagian dari nama, bukan pemisah path.Periksa apa yang dihasilkan pembungkus Anda — jika ODM/pembantu membangun map untuk Anda, log permintaan akhir dan periksa kunci placeholder yang dihasilkannya.
Bekerja dengan atribut yang namanya penuh titik dan tanda hubung? Aplikasi desktop DynoTable membangun kuerinya dengan nama yang dialias dengan benar secara otomatis, apa pun nama atributnya.
Kesalahan terkait
- Attribute name is a reserved keyword — alasan besar lain untuk menggunakan
ExpressionAttributeNames. - Value provided in ExpressionAttributeNames unused in expressions
- Value provided in ExpressionAttributeValues unused
- Pelajari: 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
Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.