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