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   荣锋亮  阅读(17)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2022-05-10 citus vs greenplum 对比参考
2022-05-10 使用citus 列式存储压缩数据
2022-05-10 citus 以及timescaledb对于时许数据存储的处理
2021-05-10 cubestore 配置
2019-05-10 dinoql 使用nodejs 运行的几个问题
2019-05-10 dinoql 试用
2019-05-10 dinoql 使用graphql 语法查询javascript objects

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示