【问题标题】:Can dbt macros accept other macros as arguments?dbt 宏可以接受其他宏作为参数吗?
【发布时间】:2021-09-06 18:54:05
【问题描述】:

我很好奇我是否可以像这样将宏传递给另一个宏:

{% macro my_macro(a, b, another_macro) %}
  ...
  {{ another_macro(a,b) }}
  ...
{% endmacro %}

奖励: 如果 dbt 的框架可以允许它能够如何传递参数给它?

在 R 中它看起来像

my_callable_function <- function(another_function, ...) {
  ...
  another_function(...)
  ...
}

【问题讨论】:

    标签: jinja2 dbt


    【解决方案1】:

    在 dbt cloud 的 slack 上的一次对话以及一些戳戳和催促让我得到了答案。

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

    示例可能如下所示!

    {% macro base_macro(func1, arg1, arg2) %}
      {{ func1(arg1, arg2) }}
    {% endmacro %}
    

    【讨论】:

      【解决方案2】:

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

      {% macro sum_of_two_columns(a, b) %}
        a + b
       
      {% endmacro %}
      

      然后在您的模型文件中,您将拥有类似的东西

      select 
      revenue1,
      revenue2,
      {{ sum_of_two_columns('revenue1','revenue2') }} as total_revenue
      
      from [table]
      

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

      {% macro subtracting_column(a) %}
        a - 100
      {% endmacro %}
      

      终于可以使用了:

          select 
          revenue1,
          revenue2,
          {{ sum_of_two_columns('revenue1','revenue2') }} as total_revenue,
          {{ subtracting_column('total_revenue') }} as adjusted_revenue
          
          from [table]
      

      简而言之,您会将一个宏的结果传递给另一个您想要的宏

      【讨论】:

      • 不确定我是否遵循您的最后一个示例。您的 subtracting_column 不接受您示例的预期 total_revenue 参数。
      • 是的,这是一个错字,现已修正
      • @ReidWilliams 你检查了吗
      猜你喜欢
      • 2014-05-27
      • 2012-04-23
      • 1970-01-01
      • 2011-12-19
      • 2012-05-27
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多