dbt 宏可以接受其他宏作为参数吗?

Rei*_*ams 7 jinja2 dbt

我很好奇是否可以将宏传递到另一个宏中,如下所示:

{% macro my_macro(a, b, another_macro) %}
  ...
  {{ another_macro(a,b) }}
  ...
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

奖励: 如果 dbt 的框架允许它能够,我如何向它传递参数?

在 R 中它看起来像

my_callable_function <- function(another_function, ...) {
  another_function(...)
}
Run Code Online (Sandbox Code Playgroud)

Rei*_*ams 10

一次关于 dbt cloud slack的对话以及一些戳戳和刺激让我得到了答案。

是的,您可以将嵌套宏传递到宏中,就像不同语言中的嵌套函数一样!

一个例子可能是这样的!

{% macro base_macro(func1, arg1, arg2) %}
  {{ func1(arg1, arg2) }}
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)


tri*_*ion 2

我不确定,但如果你正在计算 dbt 中的某些内容

{% macro sum_of_two_columns(a, b) %}
  a + b
 
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

然后在你的模型文件中你会有类似的东西

select 
revenue1,
revenue2,
{{ sum_of_two_columns('revenue1','revenue2') }} as total_revenue

from [table]
Run Code Online (Sandbox Code Playgroud)

现在您可以在您想要创建的第二个宏中传递total_revenue:例如:

{% macro subtracting_column(a) %}
  a - 100
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

最后你可以使用它:

    select 
    revenue1,
    revenue2,
    {{ sum_of_two_columns('revenue1','revenue2') }} as total_revenue,
    {{ subtracting_column('total_revenue') }} as adjusted_revenue
    
    from [table]
Run Code Online (Sandbox Code Playgroud)

简而言之,您将把一个宏的结果传递给另一个宏,这就是您想要的