dbt 使用adapter.dispatch 进行macro 的覆盖处理
adapter.dispatch 是一个很方便的功能,可以实现方法的重载,对于不同环境可以使用不同的macro ,以下是一个简单示例
macro 定义
- appdemo.sql
注意在macros 目录下,当然可以修改
{% macro demo(name,age) %}
# 注意此处我没有指定,namespace 或者package, 对于package 开发人员推荐明确指定下namespace 或者package
{{adapter.dispatch('app')(name,age) }}
{% endmacro %}
# 默认是以<adapterprefix>__ 开头的,同时default__ 属于一个默认实现,dbt 会按照实际的adapter 场景进行查找
{% macro default__app(name,age) %}
{{name ~ age }}
{% endmacro %}
{%macro dremio__app(name,age) %}
{{name ~ age ~ "mydbt" }}
{% endmacro %}}
使用
- mymodel.sql
models 目录
{% set info = demo('dalong',33) %}
SELECT * FROM {{ info }}
- 效果
因为我使用了dbt dremio 的adapter, 而且默认包含了实现就会使用dremio__app macro
说明
dbt adapter macro 提供的一些能力比较方便,可以让macro 实现不少动态能力,当然dbt 还支持自定义pacakge 的搜索实现灵活的包macro 处理
参考资料
https://docs.getdbt.com/reference/dbt-jinja-functions/dispatch
https://github.com/dbt-labs/dbt-utils
https://docs.getdbt.com/docs/build/packages