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/