dbt macro kwargs 参考的使用

从机制上实际上属于jinja2 的功能,可以实现灵活的扩展能力

jinja2 macro 提供的几个变量

  • varargs
    就类似python 的var 变量
  • kwargs
    是实现了keywords 参数的变量,可以获取传递的keyword 信息(实际上就是一个字典)
  • caller
    是在使用call tag 时候使用的,比如dbt 的statement macro 就使用了此方法

一个参考使用

比如自定义ref 我们可以自己传入一些参数

  • 定义
{% macro ref(model_name, v=None)%}
 
    {%- set relation = builtins.ref(model_name, v=v) -%}
 
    {{log('user my ref' ~ relation , info=True)}}
    # 此处通过kwargs 获取一些参数
    {{log("kwargs info mybranch  " ~ kwargs.get('mybranch'),info=True)}}
 
    {% if execute %}
        {% set my_source = model.config %}
        {%- set relation2 = api.Relation.create(schema=my_source.schema, identifier=my_source.table) -%}
        {% if my_source.branch %}
           {{ return (relation2 ~ ' AT ' ~ ' branch ' ~ my_source.branch) }}
        {% else %}
          {{ return (relation2) }}
        {% endif %}
    {% endif %}
 
    {{return (relation)}}
{% endmacro %}
  • 使用
{{
    config(
        branch='prod',
        schema = "dbtv4",
        table = "dalongdemoapp"
    )
}}
# 此处实现自定义参数的传递
select * from {{ref("nessiev3",mybranch='prod')}}

说明

使用好kwargs 特性,实际上就具有了类似config 的一些能力,对于提示dbt macro 的扩展能力还是很方便的,比如dbt 一些macro 就使用了此方法(dbt-adapter 的merge,dbt-utils 的not_null_proportion)

参考资料

dbt/include/global_project/macros/materializations/models/incremental/merge.sql
macros/generic_tests/not_null_proportion.sql
https://jinja.palletsprojects.com/en/3.1.x/templates/

posted on 2024-06-10 07:13  荣锋亮  阅读(16)  评论(0编辑  收藏  举报

导航