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 di ExpressionAttributeNames harus 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

  1. Gunakan placeholder sederhana dan petakan masing-masing ke nama sebenarnya:

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

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

Kesalahan terkait

Referensi

Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Bekerja dengan DynamoDB tanpa Console

Klien desktop DynamoDB yang cepat dan menjalankan SQL sungguhan yang tidak bisa dijalankan DynamoDB — JOINs, GROUP BY, agregasi — dengan editing visual dan agen AI pada kunci Bedrock milik Anda sendiri.

Uji coba gratis 30 hari, tanpa kartu kredit — lalu paket Free tanpa batas waktu.