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: 1 validation error detected: ExpressionAttributeNames contains invalid key:
Syntax error; key: "#my.attribute"
# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: 1 validation error detected: 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 itu 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.
Bagaimana 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.
Cek di DynoTable
DynoTable membangun kueri dengan placeholder berawalan # yang sederhana — nama atribut yang mengandung titik, tanda hubung, atau kata reserved dialias dengan benar di sisi kanan map. Buka sebuah tabel dengan ⌘K, tambahkan filter, lalu salin ExpressionAttributeNames yang dihasilkan.
Periksa silang nama atribut di pemeriksa kata reserved saat Anda menulis alias secara manual. Ganti profil dengan ⌘P; lihat Menghubungkan ke AWS dan Instal.
Sumber
- Expression attribute names (aliases) in DynamoDB (diverifikasi 13-07-2026)
- Reserved words in DynamoDB (diverifikasi 13-07-2026)
Kesalahan terkait
- Attribute name is a reserved keyword — alasan besar lain untuk menggunakan
ExpressionAttributeNames. - Nilai yang diberikan di ExpressionAttributeNames tidak digunakan dalam ekspresi
- Nilai yang diberikan di ExpressionAttributeValues tidak digunakan
- Pelajari: Expression names & values
Referensi
- 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.