通过 DRY LookML 最大限度地提高代码的可重用性:只需定义一次字段,即可在所有位置使用替换运算符

LookML 字段定义可能会随时间而变化。例如,数据库列名称可能会发生变化,或者您可能出于其他原因需要更改 LookML 字段的定义。

如果您使用语法 {TABLE}.field_name 直接在多个位置引用数据库列,则必须手动更新每个引用。如果您忘记更新引用该维度的所有字段,这些字段都可能会损坏,并且 Looker 会显示错误:

Looker 会在字段列表中显示“未知列 order_items.sale_price”错误。

为了提高 LookML 项目的效率并简化维护工作,您可以在一个位置定义字段,然后使用替换运算符 ($) 在其他任何位置引用这些字段。

本页面提供了使用替换运算符(采用语法 ${field_name})在多个 LookML 字段的定义中引用单个维度的示例。

原料

前提条件

示例:仅对一个维度引用一次底层数据库列

在 LookML 项目中,使用维度的 sql 参数中的语法 ${TABLE}.field_name 一次性定义数据库表列。然后,在项目的其他位置使用 ${field_name}${view_name.field_name} 语法引用该维度。这样,您就可以在一个位置(原始 ${TABLE}.field_name 维度)维护数据库列的 LookML 定义,这在您需要在项目中的多个位置引用它时很有帮助。

例如,您可以使用语法 ${TABLE}.sale_price 在名为 order_items 的视图中定义一个名为 sale_price 的基础维度:


  dimension: sale_price {
    type: number
    value_format_name: usd
    sql: ${TABLE}.sale_price ;;
    description: "The price at which an item is set to sell."
  }

定义引用 sale_price 维度的其他字段时,可以在 order_items 视图中使用语法 ${sale_price}(或者在其他视图中使用语法 ${order_items.sale_price} 引用 sale_price 维度)。


dimension: profit {
  type: number
  value_format_name: usd
  sql: ${sale_price} - ${inventory_items.cost} ;;
  description: "The difference between an item's sale price and an item's cost."
}

dimension: item_gross_margin {
  type: number
  value_format_name: percent_2
  sql: 1.0 * ${profit}/NULLIF(${sale_price},0) ;;
}

measure: total_sale_price {
  type: sum
  value_format_name: usd
  sql: ${sale_price} ;;
}

在此示例中,如果维度 sale_price 的列名称发生变化,您只需在基础 sale_price 维度的定义中更新 ${TABLE}.sale_price 引用一次。然后,这项更改将自动传播到 profititem_gross_margintotal_sale_price 字段,以及引用 sale_price 维度的所有其他字段。