處理 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 問題:
以下各節將進一步說明樹狀結構中的情境。
為什麼會發生這個錯誤?
造成這項錯誤的原因如下:
- 您參照的欄位不存在。
- 
   您參照的欄位是整個維度群組,例如參照維度群組時未附加 timeframe。
- 部分探索無法存取該欄位,因為缺少聯結。
欄位不存在
  如果 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 尚未加入。
如要查看造成問題的探索,請展開錯誤訊息中醒目顯示的事件:
   
  這些事件表示 ecommerce 模型中的 order_items 和 orders 探索導致錯誤。這些探索具有許多聯結,並在模型檔案中定義如下:
  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 不會觸發錯誤。
如果錯誤是由於缺少聯結所致,該如何修正?
如果錯誤是由缺少聯結所致,可以透過下列幾種方式修正:
- 
    在所有案件中加入缺少的檢視畫面。如要使用本頁面中的範例,請確保在「探索」中彙整 users檢視區塊時,user_order_facts檢視區塊也會彙整。
- 如果不希望加入缺少的檢視區塊,請從探索中排除導致錯誤的欄位。
加入缺少的檢視畫面
  在上述範例中,只要將 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 參數,從「探索」中排除導致錯誤的欄位 (users.lifetime_orders)。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}
    }
  }