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"} 是無效的。
  • 一個從屬性名自動生成預留位置的庫,其屬性名包含點或特殊字元,把該字元直接透傳了過去。

如何修正

  1. 使用簡單的預留位置並把每個對映到真實名稱:

    {
      ExpressionAttributeNames: {'#p0': 'user-id', '#p1': 'stats'},
      KeyConditionExpression: '#p0 = :uid'
    }
  2. 對於巢狀路徑,分別為每個段起別名——每個路徑元素一個預留位置,在運算式中用字面的點連線:

    // 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'}——這樣點就被當作名稱的一部分,而非路徑分隔符。

  3. 檢查你的封裝生成了什麼——如果一個 ODM/輔助工具為你構建了這個 map,記錄最終請求並檢查它生成的預留位置鍵。

在處理名稱滿是點和橫線的屬性?DynoTable 桌面應用會自動用正確起別名的名稱構建查詢,無論屬性叫什麼。

在 DynoTable 中核對

DynoTable 使用簡單的 # 字首預留位置構建查詢 - 帶有點、破折號或保留字的屬性名稱在地圖的右側正確別名。用⌘K開啟一個表,新增過濾器,然後複製生成的ExpressionAttributeNames。當你手寫別名時,請交叉檢查 reserved words checker 中的屬性名稱。使用 ⌘P 切換設定檔案;參見連線 AWS安裝

來源

相關錯誤

參考資料

最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。