Fehler: Unbekanntes oder nicht zugängliches Feld

Wenn Sie mit Ihren LookML-Dateien arbeiten und mit Ihren Aktualisierungen zufrieden sind, führen Sie zur Bereitstellung Ihrer LookML-Änderungen im nächsten Schritt den LookML Validator aus, um eine vollständige Modellvalidierung durchzuführen.

Gelegentlich kann eine Fehlermeldung wie die folgende angezeigt werden:

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

In diesem Beispiel bezieht sich der Fehler auf das Feld lifetime_orders in der Ansicht users. Der Fehler weist darauf hin, dass users.lifetime_orders nicht auf das Feld user_order_facts.lifetime_orders zugreifen kann, auf das es verweist.

Warum tritt dieser Fehler auf?

Dieser Fehler kann verschiedene Ursachen haben:

  1. Das Feld, auf das Sie verweisen, ist nicht vorhanden.
  2. Das Feld, auf das Sie verweisen, ist eine ganze Dimensionsgruppe. Beispielsweise wird auf eine Dimensionsgruppe ohne angehängtes timeframe verwiesen.
  3. Einige Explores können nicht auf das Feld zugreifen, da ein Join fehlt.

Option 1: Das Feld ist nicht vorhanden

Wenn in LookML-Feldern auf das Feld user_order_facts.lifetime_orders verwiesen wird, es aber selbst nicht als Feld vorhanden ist, wird der Fehler unknown or inaccessible field angezeigt.

Sie können den Fehler beheben, indem Sie das Feld, das den Fehler auslöst (in diesem Beispiel user_order_facts.lifetime_orders), der Ansicht hinzufügen, die das betreffende Feld enthält. In diesem Fall können Sie dafür sorgen, dass das Feld in der Ansicht user_order_facts definiert ist. Wenn es nicht vorhanden ist, können Sie es hinzufügen.

Option 2: Das Feld verweist auf eine ganze Dimensionsgruppe

Dimensionsgruppen stellen eine Gruppe von Dimensionen dar. type: time-Dimensionsgruppen stellen eine Gruppe von Zeitraumdimensionen dar, die im timeframe-Parameter definiert sind. Wenn Sie in LookML auf Dimensionsgruppen verweisen, müssen Sie die entsprechende Dimension (in diesem Fall timeframe) an den Namen der Dimensionsgruppe anhängen.

Sehen wir uns zum Beispiel die folgende Dimensionsgruppe an:

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

Wenn Sie in einem anderen LookML-Feld auf die Dimensionsgruppe created verweisen möchten, müssen Sie auf eine bestimmte Zeitrahmen-Dimension innerhalb der Gruppe verweisen, z. B. auf eine der folgenden Optionen:

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

Wenn Sie versuchen, nur den Namen der Dimensionsgruppe (${created}) zu verwenden, weiß Looker nicht, auf welchen Zeitraum Sie sich beziehen, und löst einen Fehler aus.

Option 3: Ein Join fehlt

Im Folgenden finden Sie die LookML-Definition von users.lifetime_orders:

  dimension: lifetime_orders {
    type: number
    sql: ${user_order_facts.lifetime_orders};;
  }
Beachten Sie, dass die Substitutionsoperatoren ${} verwendet werden, um auf das LookML-Feld user_order_facts.lifetime_orders zu verweisen.

Die Dimension lifetime_orders in der Ansicht users verweist auf das Feld lifetime_orders aus der Ansicht user_order_facts. In diesem Fall wird der Fehler ausgelöst, da es in der Modelldatei Instanzen gibt, in denen die Ansicht users mit einem Explore verknüpft ist, ohne dass user_order_facts ebenfalls verknüpft wurde.

Wenn Sie sehen möchten, welche Explores das Problem verursachen, können Sie die in der Fehlermeldung hervorgehobenen Vorkommen maximieren:

Maximierte Fehlermeldung, in der die Ansichten, Codezeilen und Explores für zwei Ursachen angezeigt werden: „users:79“ (ecommerce:order_items) und „users:79“ (ecommerce:orders)

Diese Vorkommen zeigen, dass die Explores order_items und orders im Modell ecommerce den Fehler verursachen. Diese Explores haben viele Joins und sind in der Modelldatei so definiert:

  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}
    }
  }

In beiden Explores wird die users-Ansicht ohne gleichzeitig die user_order_facts-Ansicht verbunden. Daher kann kein Explore auf das Feld user_order_facts.lifetime_orders zugreifen. Wenn Sie versuchen, das Feld users.lifetime_orders, das auf user_order_facts.lifetime_orders verweist, in einem der beiden Explores abzufragen, würden Sie den Fehler auslösen.

Der LookML-Validator warnt Sie, dass Nutzer den Fehler erhalten, wenn sie users_order_facts.lifetime_orders abfragen. Das Feld users.lifetime_orders löst keinen Fehler in einem Explore aus, mit dem user_order_facts ebenfalls verknüpft ist.

Sehen wir uns beispielsweise das Explore users an:

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

Hier ist user_order_facts verknüpft, sodass die Abfrage von users.lifetime_orders keinen Fehler auslöst.

Wie kann ich den Fehler beheben, der durch einen fehlenden Join verursacht wird?

Wenn der Fehler durch einen fehlenden Join verursacht wird, haben Sie mehrere Möglichkeiten, ihn zu beheben:

  1. Die fehlende Ansicht in allen Supportanfragen verknüpfen. Für das auf dieser Seite verwendete Beispiel muss die Ansicht user_order_facts dort verbunden werden, wo die Ansicht users in einem Explore verbunden wird.
  2. Schließen Sie das Feld aus, das in Explores den Fehler verursacht, wenn Sie die fehlende Ansicht nicht zusammenführen möchten.

Der fehlenden Ansicht beitreten

Im vorherigen Beispiel lässt sich der Fehler beheben, indem user_order_facts mit allen Explores verknüpft wird, in denen users ebenfalls verknüpft ist. Dadurch können Explores auf user_order_facts.lifetime_orders zugreifen, wenn users.lifetime_orders in einer Abfrage verwendet wird.

Über den Metadatenbereich in der IDE können Sie sich alle Explores ansehen, die die Ansicht users verwenden.

Im folgenden Beispiel werden die fehlenden Ansichten zusammengeführt:

  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}
    }
  }

Wenn Sie den LookML-Validator jetzt noch einmal ausführen, sollte dieser Fehler nicht mehr angezeigt werden.

Das Feld, das den Fehler verursacht, aus Explores ausschließen

Möglicherweise möchten Sie nicht für alle Explores, in denen users verknüpft ist, der Ansicht user_order_facts beitreten. Vielleicht möchten Sie beispielsweise nicht, dass Nutzer auf die Felder aus der Ansicht user_order_facts im Explore orders zugreifen, aber Sie möchten, dass Nutzer ohne Fehler auf die Felder aus der Ansicht users zugreifen können. Dazu schließen Sie das Feld, das den Fehler verursacht (users.lifetime_orders), aus dem Explore orders aus. Verwenden Sie dazu den Parameter fields.

Mit dem Parameter fields für Explores können Sie bestimmte Felder in einem Explore ein- oder ausschließen. In diesem Fall können Sie users.lifetime_orders so aus dem orders-Explore ausschließen:

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