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

posted on 2024-04-21 08:00  荣锋亮  阅读(6)  评论(0编辑  收藏  举报

导航