dbt macro 中获取relation 的几种方法

很多时候我们是希望在自己开发的macro中引用relation 这样可以获取实际模型在数据库中的信息,方便数据的写入,或者进行查询
实现动态能力,尤其在进行数据质量方便的处理时候,以下简单说明下一些可选的方法

参考方法

  • 直接使用api.Relation.create 创建新的
    如果知道一些信息(database,schema,name)就可以直接使用此方法直接创建relation了,参数的传递方法很多
  • adapter 的get_relation 方法
    需要的参数与api.Relation.create基本类似
  • load_relation
    属于get_relation 的一个包装,返回一个cache 版本的relation
  • 使用builtins.ref 方法
    传递模型名称就可以了,属于dbt 内置的很不错的选择
  • 通过this 处理
    this 属于一个小技巧,是在执行的时候处理的,所以如果我们在一个模型中调用一个macro macro 使用了this 也是可以获取到当前的模型的relation 的
  • 通过graph nodes 处理
    这个属于一个比较通用的玩法,不少三方包都使用了此方法
    参考处理
{% macro get_relation(relation_name) %}
    {% if execute %}
       ## 通过graph.nodes 结合一些jinja2的filter 获取database、schema、name 信息,结合api.Relation.create 创建新的
        {% set model_get_relation_node = graph.nodes.values() | selectattr('name', 'equalto', relation_name) | first %}
        {% set relation = api.Relation.create(
            database = model_get_relation_node.database,
            schema = model_get_relation_node.schema,
            identifier = model_get_relation_node.alias
        )
        %}
        {% do return(relation) %}
    {% else %}
        {% do return(api.Relation.create()) %}
    {% endif %}
{% endmacro %}

说明

以上是一些简单说明,对于dbt relation 比较重要,动态能力是最好的,不能硬编码,这样不利于后续的升级迭代,同时也缺少了可复用性,不符合dbt 的玩法

参考资料

https://docs.getdbt.com/reference/dbt-jinja-functions/builtins
https://docs.getdbt.com/reference/dbt-jinja-functions/adapter

posted on 2024-05-10 12:57  荣锋亮  阅读(6)  评论(0编辑  收藏  举报

导航