ExpressionAttributeNames contains invalid key: Syntax error
TL;DR — 問題出在你 ExpressionAttributeNames map 左側的預留位置鍵上,而不是它指向的屬性。一個預留位置必須是 # 後跟純字母、數字或下劃線(#name、#p0)。如果你把真實的屬性名——連同它的點、連字元、+ 號或空格——放進預留位置本身,DynamoDB 會拒絕這個 map。讓預留位置保持無趣;把雜亂的真實名稱放在右側。
這是什麼意思
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 把一個預留位置標記(用在你的運算式內部)對映到一個真實的屬性名。DynamoDB 在接觸你的資料之前會驗證預留位置的語法:它必須以 # 開頭,且只包含在運算式標記內部有效的字元。在運算式語法中有含義的特殊字元——.(路徑分隔符)、-、+、空格——會使預留位置本身無法解析,整個請求都會以這個 ValidationException 被拒絕。
為什麼會發生
- 真實的屬性名被複制進了預留位置——例如
{"#stats.daily": "stats.daily"}。_鍵_中的點是一個語法錯誤,無論它對映到什麼。 - 預留位置中的特殊字元——連字元(
#user-id)、+號或空格。#之後只有字母數字和下劃線是安全的。 - 缺少
#——ExpressionAttributeNames中的鍵必須以#開頭;{"name": "name"}是無效的。 - 一個從屬性名自動生成預留位置的庫,其屬性名包含點或特殊字元,把該字元直接透傳了過去。
如何修正
使用簡單的預留位置並把每個對映到真實名稱:
{ ExpressionAttributeNames: {'#p0': 'user-id', '#p1': 'stats'}, KeyConditionExpression: '#p0 = :uid' }對於巢狀路徑,分別為每個段起別名——每個路徑元素一個預留位置,在運算式中用字面的點連線:
// read stats.daily where the item has a top-level "stats" map { ProjectionExpression: '#s.#d', ExpressionAttributeNames: {'#s': 'stats', '#d': 'daily'} }注意反面情況:如果屬性的_實際名稱_包含一個字面的點(一個名為
"stats.daily"的屬性,而非巢狀路徑),那麼為整個名稱用一個預留位置正是你想要的——{'#sd': 'stats.daily'}——這樣點就被當作名稱的一部分,而非路徑分隔符。檢查你的封裝生成了什麼——如果一個 ODM/輔助工具為你構建了這個 map,記錄最終請求並檢查它生成的預留位置鍵。
在處理名稱滿是點和橫線的屬性?DynoTable 桌面應用會自動用正確起別名的名稱構建查詢,無論屬性叫什麼。
在 DynoTable 中核對
DynoTable 使用簡單的 # 字首預留位置構建查詢 - 帶有點、破折號或保留字的屬性名稱在地圖的右側正確別名。用⌘K開啟一個表,新增過濾器,然後複製生成的ExpressionAttributeNames。當你手寫別名時,請交叉檢查 reserved words checker 中的屬性名稱。使用 ⌘P 切換設定檔案;參見連線 AWS和安裝。
來源
- Expression attribute names (aliases) in DynamoDB(2026-07-13 驗證)
- Reserved words in DynamoDB(2026-07-13 驗證)
相關錯誤
- Attribute name is a reserved keyword——使用
ExpressionAttributeNames的另一個重要原因。 - Value provided in ExpressionAttributeNames unused in expressions
- ExpressionAttributeValues 裡提供的值未被使用
- 學習:Expression names & values
參考資料
- Expression attribute names (aliases) in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。