Skip to content

ref

简介

dbt中最重要的函数是ref();没有它将不可能构建中等复杂的模型。ref()是在另一个模型中引用一个模型的方式。这是一种非常常见的方式,因为通常模型都是堆叠在一起的。以下是实践中的情况:

select *
from public.raw_data

select *
from {{ref('model_a')}}

ref()实际上是在做两件重要的事情。首先,它将模式(schema)插入到模型文件中,以允许您通过配置更改部署模式。其次,它使用这些模型之间的引用来自动构建依赖关系图。这将使dbt在使用dbt-run时能够按正确的顺序部署模型。

0.9.0的新能力

`{{ ref }}`函数返回一个`Relation`对象,该对象在[{{ this }}](this)变量处具有相同的`表(table)`,`模式(schema)`和`名称(name)`属性.

ref的高级用法

双参数变量

ref函数还有一个双参数变量。使用此变量,可以将包名称和模型名称都传递给ref以避免歧义。典型的dbt使用通常不需要此功能。

select * from {{ ref('package_name', 'model_name') }}

注意: 包名称package_name应该只包含包的名称,而不包括维护者。比如,如果你使用包fivetran/stripe ,在参数中输入stripe,而不是fivetran/stripe.

强制依赖项

在正常使用中,dbt知道根据ref函数的使用来运行所有模型的正确顺序。不过,在某些情况下,dbt不知道什么时候应该运行模型。这方面的一个例子是当模型只引用宏时。在这种情况下,dbt认为模型可以首先运行,因为在编译时没有进行显式引用。为了解决这个问题,您可以使用SQL注释和ref函数,dbt将理解依赖关系,编译后的查询仍然有效:

 -- depends_on: {{ ref('upstream_parent_model') }}

 {{ your_macro('variable') }}

dbt将看到ref,并在指定的引用之后构建此模型。