Attribute name is a reserved keyword
TL;DR — Anda menggunakan nama atribut yang merupakan salah satu kata reserved DynamoDB (ada ~570 — status, name, size, type, data, year, count, dan banyak lagi) langsung dalam expression. Ganti dengan placeholder ExpressionAttributeNames — #status dipetakan ke status — dan permintaan berjalan.
Apa artinya
ValidationException: 1 validation error detected: Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: status
ValidationException: 1 validation error detected: Invalid KeyConditionExpression: Attribute name is a reserved keyword; reserved keyword: nameDynamoDB menyimpan daftar kata reserved yang tidak dapat muncul secara literal dalam expression (UpdateExpression, ConditionExpression, FilterExpression, KeyConditionExpression, ProjectionExpression). Ketika atribut Anda kebetulan salah satunya, parser menolak expression. Ini ValidationException (HTTP 400), tidak dapat dicoba ulang sampai Anda meng-alias nama. Pesan menyebut kata reserved yang tepat.
Mengapa itu terjadi
- Nama atribut umum bertabrakan dengan kata reserved —
status,name,size,type,data,year,count,timestamp,source,region, dan ratusan lainnya reserved. ProjectionExpressionyang mendaftarkan nama atribut reserved langsung.FilterExpression/ConditionExpressionyang merujuk nama reserved (#status = :sberfungsi;status = :stidak).- Nama atribut yang dimulai dengan angka, atau berisi spasi, titik, atau tanda hubung — ini juga membutuhkan alias
ExpressionAttributeNames, dan menghasilkan kesalahan validasi terkait.
Bagaimana cara memperbaikinya
- Alias nama dengan
ExpressionAttributeNames. Petakan#placeholderke nama sebenarnya dan gunakan placeholder dalam expression:await doc.send( new UpdateCommand({ TableName: 'Orders', Key: {pk: 'ORDER#1'}, UpdateExpression: 'SET #status = :s', ExpressionAttributeNames: {'#status': 'status'}, ExpressionAttributeValues: {':s': 'shipped'} }) ); - Placeholder harus dimulai dengan
#diikuti alfanumerik/underscore, dan setiap#nameyang digunakan harus didefinisikan (dan setiap yang didefinisikan digunakan). - Alias secara defensif — meng-alias setiap nama atribut dalam expression Anda menghindari keharusan mengetahui kata mana yang reserved.
- Alias nama yang berisi titik literal dengan placeholder tunggal — atribut yang secara literal bernama
Safety.Warningbutuh satu alias untuk seluruh nama ({'#sw': 'Safety.Warning'}), karena.yang tidak di-alias dibaca sebagai pemisah document-path. Untuk path yang benar-benar bersarang, alias setiap segmen sebagai gantinya (#pr.#5star).
FAQ
Bagaimana cara memperbaiki "Attribute name is a reserved keyword" di DynamoDB? Alias atribut dengan ExpressionAttributeNames. Petakan placeholder seperti #status ke nama sebenarnya "status" dan gunakan #status dalam expression alih-alih kata literal. Placeholder harus dimulai dengan # dan setiap yang Anda definisikan harus digunakan.
Nama atribut DynamoDB mana yang reserved? Ada sekitar 570 kata reserved, termasuk nama sehari-hari seperti status, name, size, type, data, year, count, timestamp, dan region. Alih-alih menghafal daftar, alias setiap nama atribut dalam expression Anda dengan ExpressionAttributeNames.
Kesalahan terkait
- Invalid UpdateExpression syntax — struktur expression salah bentuk.
- ValidationException (ikhtisar)
- Contoh kode: UpdateItem in Node.js · in Python (boto3) — kata reserved di-alias dengan #placeholder.
- Pelajari: Expression names & values · Update expressions
Referensi
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
- Constraints in Amazon DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.