錯誤:不明或無法存取的欄位

處理 LookML 檔案並對更新內容感到滿意後,部署 LookML 變更的下一個步驟就是執行 LookML 驗證工具,進行完整的模型驗證。

有時您可能會看到類似下列內容的錯誤:

 Unknown or inaccessible field "user_order_facts.lifetime_orders" referenced in "users.lifetime_orders". Check for typos and missing joins.

在本例中,錯誤是指 users 檢視區塊中的 lifetime_orders 欄位。這項錯誤表示 users.lifetime_orders 無法存取所參照的 user_order_facts.lifetime_orders 欄位。

偵錯樹狀結構

請使用下列決策樹,排解常見的 Liquid 問題:

以下各節將進一步說明樹狀結構中的情境。

為什麼會發生這個錯誤?

造成這項錯誤的原因如下:

  1. 您參照的欄位不存在
  2. 您參照的欄位是整個維度群組,例如參照維度群組時未附加 timeframe
  3. 部分探索無法存取該欄位,因為缺少聯結

欄位不存在

如果 LookML 欄位參照了 user_order_facts.lifetime_orders 欄位,但該欄位本身不存在,您會收到 unknown or inaccessible field 錯誤。

如要解決這項錯誤,請將觸發錯誤的欄位 (在本例中為 user_order_facts.lifetime_orders) 新增至包含相關欄位的檢視區塊。在這種情況下,請確認欄位是否已在 user_order_facts 檢視畫面中定義;如果沒有,請新增欄位。

這個欄位會參照整個維度群組

維度群組代表一組維度。type: time 維度群組代表 timeframe 參數中定義的一組時間週期維度。在 LookML 中參照維度群組時,必須在維度群組名稱後方附加適當的維度 (在本例中為 timeframe)。

舉例來說,請參考下列維度群組:

  dimension_group: created {
    type: time
    timeframes: [date, week, month]
    sql: ${TABLE}.created_at ;;
  }

如要在其他 LookML 欄位中參照 created 維度群組,您必須參照群組中的特定時間範圍維度,例如下列其中一個:

  • date${created_date}
  • week${created_week}
  • month${created_month}

如果您只嘗試使用維度群組的名稱 (${created}),Looker 不會知道您指的是哪個時間範圍,因此會產生錯誤。

缺少聯結

以下是 users.lifetime_orders 的 LookML 定義:

  dimension: lifetime_orders {
    type: number
    sql: ${user_order_facts.lifetime_orders};;
  }
請注意,使用替代運算子 ${} 參照 LookML 欄位 user_order_facts.lifetime_orders

users 檢視中的 lifetime_orders 維度會參照 user_order_facts 檢視中的 lifetime_orders 欄位。在本例中,模型檔案中的執行個體會將 users 檢視區塊加入 Explore ,但不會加入 user_order_facts,因此觸發錯誤。

如要查看造成問題的 Explore,請展開錯誤訊息中醒目顯示的事件:

展開的錯誤訊息,顯示兩個原因的檢視畫面、檢視畫面程式碼行和探索:users:79 (ecommerce:order_items) 和 users:79 (ecommerce:orders)。

這些事件表示 ecommerce 模型中的 order_itemsorders 探索導致錯誤。這些探索具有許多聯結,並在模型檔案中定義如下:

  explore: orders {
    join: users { # users joined without user_order_facts
      relationship: many_to_one
      sql_on: ${orders.user_id} = ${users.id}
    }
  }

  explore: order_items {
    join: inventory_items {
      relationship: many_to_one
      sql_on: ${order_items.inventory_item_id} = ${inventory_items.id}
    }
    join: orders {
      relationship: many_to_one
      sql_on: ${order_items.order_id} = ${orders.id}
    }
    join: users { # users joined without user_order_facts
      relationship: many_to_one
      sql_on: ${orders.user_id} = ${users.id}
    }
  }

在這兩個「探索」中,users 檢視畫面會加入 user_order_facts 檢視畫面,因此這兩個「探索」都無法存取 user_order_facts.lifetime_orders 欄位。如果您嘗試在任一「探索」中查詢 users.lifetime_orders 欄位 (參照 user_order_facts.lifetime_orders),就會觸發錯誤。

LookML 驗證工具會發出警告,指出使用者查詢 users_order_facts.lifetime_orders 時會收到錯誤訊息。如果 user_order_facts 也加入探索,users.lifetime_orders 欄位就不會觸發錯誤。

舉例來說,請考慮「探索」users

  explore: users {
    join: user_order_facts {
      sql_on: ${users.id} = ${user_order_facts.users_id}
    }
  }

這裡已加入 user_order_facts ,因此查詢 users.lifetime_orders 不會觸發錯誤。

如果缺少聯結導致錯誤,該如何修正?

如果錯誤是由缺少聯結所致,可以透過下列幾種方式修正:

  1. 所有案件中加入缺少的檢視畫面。如要使用本頁面中的範例,請確保在「探索」中彙整 users 檢視區塊時,user_order_facts 檢視區塊也會彙整。
  2. 如果不希望加入缺少的檢視區塊,請從探索中排除導致錯誤的欄位。

加入缺少的檢視畫面

在上述範例中,只要將 user_order_facts 加入所有也加入 users 的探索,即可解決錯誤。這樣一來,當查詢中使用 users.lifetime_orders 時,探索就能存取 user_order_facts.lifetime_orders

您可以使用 IDE 中的中繼資料面板,查看所有使用 users 檢視區塊的探索。

以下範例會加入缺少的檢視區塊:

  explore: order_items {
    join: inventory_items {
      relationship: many_to_one
      sql_on: ${inventory_items.id} = ${order_items.inventory_item_id}
    }
    join: orders {
      relationship: many_to_one
      sql_on: ${order_items.order_id} = ${orders.id}
    }
    join: users {
      relationship: many_to_one
      sql_on: ${orders.user_id} = ${users.id}
    }
    join: user_order_facts { # join user_order_facts through users
      relationship: many_to_one
      sql_on: ${users.id} = ${user_order_facts.users_id}
    }
  }

現在重新執行 LookML 驗證器,應該就不會再看到這項錯誤。

從探索中排除導致錯誤的欄位

您可能不想將 user_order_facts 檢視畫面加入所有已加入 users 的探索。舉例來說,您可能不希望使用者在「探索」的 user_order_facts 檢視畫面中存取欄位,但希望使用者在 users 檢視畫面中存取欄位時不會發生錯誤。orders如要這麼做,請使用 fields 參數,從「探索」orders 中排除導致錯誤的欄位 users.lifetime_orders

您可以使用「探索」的 fields 參數,在探索中納入或排除特定欄位。在這種情況下,您可以從 orders 探索中排除 users.lifetime_orders 欄位,如下所示:

  explore: orders {
    fields: [-users.lifetime_orders] # exclude users.lifetime_orders
    join: users {
      relationship: many_to_one
      sql_on: ${orders.user_id} = ${users.id}
    }
  }