Fehler: Unbekanntes oder nicht zugängliches Feld

Wenn Sie mit Ihren LookML-Dateien fertig sind und mit den Änderungen zufrieden sind, müssen Sie als Nächstes den LookML-Validator ausführen, um eine vollständige Modellvalidierung durchzuführen.

Gelegentlich wird möglicherweise ein Fehler wie der folgende angezeigt:

 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 gibt an, dass users.lifetime_orders nicht auf das Feld user_order_facts.lifetime_orders zugreifen kann, auf das es verweist.

Debugging-Baum

Verwenden Sie das folgende Flussdiagramm, um häufige Liquid-Probleme zu beheben:

In den folgenden Abschnitten werden die Szenarien im Baum genauer beschrieben.

Warum tritt dieser Fehler auf?

Für diesen Fehler kann es verschiedene Gründe geben:

  1. Das Feld, auf das Sie verweisen, ist nicht vorhanden.
  2. Das Feld, auf das Sie verweisen, ist eine gesamte Dimensionsgruppe – beispielsweise wird auf eine Dimensionsgruppe ohne angehängtestimeframe verwiesen.
  3. Auf das Feld kann in einigen Explores nicht zugegriffen werden, da ein Join fehlt.

Das Feld ist nicht vorhanden

Wenn im LookML auf das Feld user_order_facts.lifetime_orders verwiesen wird, es aber nicht als Feld selbst 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 prüfen, ob das Feld in der Ansicht user_order_facts definiert ist. Wenn es nicht vorhanden ist, können Sie es hinzufügen.

Das Feld verweist auf eine gesamte Dimensionsgruppe.

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

Betrachten Sie beispielsweise die folgende Dimensionsgruppe:

  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 in der Gruppe verweisen, z. B. auf eine der folgenden:

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

Wenn Sie nur den Namen der Dimensionsgruppe verwenden – ${created} –, weiß Looker nicht, auf welchen Zeitraum Sie sich beziehen, und gibt den Fehler aus.

Es fehlt ein Join

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

  dimension: lifetime_orders {
    type: number
    sql: ${user_order_facts.lifetime_orders};;
  }
Beachten Sie die Verwendung der Substitutionsoperatoren ${}, 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, weil es Instanzen in der Modelldatei gibt, in denen die Ansicht users mit einem Explore verknüpft ist, ohne dass auch user_order_facts verknüpft wurde.

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

Erweiterte Fehlermeldung mit den Ansichten, Ansichtscodezeilen und Explores für zwei Ursachen: 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 enthalten 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 Ansicht users ohne die Ansicht user_order_facts verknüpft. Daher kann in keinem der beiden Explores auf das Feld user_order_facts.lifetime_orders zugegriffen werden. Wenn Sie in einem der beiden Explorers versuchen, das Feld users.lifetime_orders abzufragen, das auf user_order_facts.lifetime_orders verweist, wird der Fehler ausgelöst.

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 den Fehler in einem Explore, dem auch user_order_facts hinzugefügt wurde, nicht aus.

Sehen Sie sich beispielsweise den users-Bericht an:

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

Hier wird user_order_facts verknüpft, sodass bei einer Abfrage von users.lifetime_orders kein Fehler ausgelöst wird.

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

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

  1. Fügen Sie die fehlende Ansicht in allen Fällen hinzu. Für das Beispiel auf dieser Seite muss die Ansicht user_order_facts überall dort eingebunden sein, wo die Ansicht users in einem Explore eingebunden ist.
  2. Schließen Sie das Feld, das den Fehler verursacht, aus Explores aus, wenn Sie die fehlende Ansicht nicht verknüpfen möchten.

Fehlende Ansicht aufrufen

Im obigen Beispiel kann der Fehler behoben werden, indem user_order_facts mit allen Explores verknüpft wird, mit denen auch users verknüpft ist. So kann in Explores auf user_order_facts.lifetime_orders zugegriffen werden, wenn users.lifetime_orders in einer Abfrage verwendet wird.

Im Metadatenbereich in der IDE können Sie alle Explores aufrufen, in denen die Ansicht users verwendet wird.

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 die LookML-Validierung 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 die Ansicht user_order_facts nicht mit allen Explores verknüpfen, in denen users verknüpft ist. 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. Dazu können Sie das Feld, das den Fehler verursacht – users.lifetime_orders – aus dem orders-Explore ausschließen. Verwenden Sie dazu den Parameter fields.

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

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