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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用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