dbt 的Relation 实际上就是包含关系数据库表,数据库,schema 一些信息的描述,dbt 官方提供了api.Relation.create 等操作
进行Relation 的维护,当然系统的builtins 也提供了一些基本的操作能力, 内部使用上会使用dbt BaseRelation 中的各类实现
比如pg 就自己扩展了一个,同时在自己的macro 中使用
参考扩展
- 定义
def get_materialized_view_config_change_collection(
self, relation_results: RelationResults, relation_config: RelationConfig
) -> Optional[PostgresMaterializedViewConfigChangeCollection]:
config_change_collection = PostgresMaterializedViewConfigChangeCollection()
existing_materialized_view = PostgresMaterializedViewConfig.from_relation_results(
relation_results
)
new_materialized_view = PostgresMaterializedViewConfig.from_config(relation_config)
config_change_collection.indexes = self._get_index_config_changes(
existing_materialized_view.indexes, new_materialized_view.indexes
)
# we return `None` instead of an empty `PostgresMaterializedViewConfigChangeCollection` object
# so that it's easier and more extensible to check in the materialization:
# `core/../materializations/materialized_view.sql` :
# {% if configuration_changes is none %}
if config_change_collection.has_changes:
return config_change_collection
return None
- 使用
{% macro postgres__get_materialized_view_configuration_changes(existing_relation, new_config) %}
{% set _existing_materialized_view = postgres__describe_materialized_view(existing_relation) %}
{% set _configuration_changes = existing_relation.get_materialized_view_config_change_collection(_existing_materialized_view, new_config.model) %}
{% do return(_configuration_changes) %}
{% endmacro %}
一个简单扩展
如果为了测试我们可以直接修改一个dbt adapter relation.py 中的一个实现,然后通过macro 就可以调用了,参考如下
- 修改
为了简单我直接修改的dremio 的relation,添加了一个新的方法
def dalongapp(self):
return "dalongapp"
- 测试
直接在一个模型中引用
{% set rel = builtins.ref("app") %}
{{log("demo " ~ rel.dalongapp(), info=True)}}
- 效果
如下日志
说明
实际上dbt 不少东西都是可以扩展的,而且扩展地方不少,只要我们上下文传递了一些信息,dbt 模型中基本都能使用到(和方法可见范围也有关系),以上是一个简单说明,也有利于我们去学习一些三方的dbt adapter
参考资料
https://docs.getdbt.com/reference/dbt-jinja-functions/builtins
https://docs.getdbt.com/reference/dbt-classes