dbt adapter 的get_relation 简单说明

dbt 的adapter.get_relation 可以方便的获取存在的relation 信息,以下是一个简单说明

参考实现

  • 内部处理
@available.parse_none
def get_relation(self, database: str, schema: str, identifier: str) -> Optional[BaseRelation]:
    relations_list = self.list_relations(database, schema)
 
    matches = self._make_match(relations_list, database, schema, identifier)
 
    if len(matches) > 1:
        kwargs = {
            "identifier": identifier,
            "schema": schema,
            "database": database,
        }
        raise RelationReturnedMultipleResultsError(kwargs, matches)
 
    elif matches:
        return matches[0]
 
    return None
  • macro 使用

比如判断是否是增量的处理

{% macro is_incremental() %}
    {#-- do not run introspective queries in parsing #}
    {% if not execute %}
        {{ return(False) }}
    {% else %}
        {% set relation = adapter.get_relation(this.database, this.schema, this.table) %}
        {{ return(relation is not none
                  and relation.type == 'table'
                  and model.config.materialized == 'incremental'
                  and not should_full_refresh()) }}
    {% endif %}
{% endmacro %}

同时还有一个快速使用的包装 load_relation
内部参考处理

{% macro load_cached_relation(relation) %}
  {% do return(adapter.get_relation(
    database=relation.database,
    schema=relation.schema,
    identifier=relation.identifier
  )) -%}
{% endmacro %}
 
-- old name for backwards compatibility
{% macro load_relation(relation) %}
    {{ return(load_cached_relation(relation)) }}
{% endmacro %}

说明

很多时候我们需要进行relation时候存在进行判断(比如增量处理,快照处理,物化处理)adapter.get_relation 以及load_relation 就是一个
很不错的帮助工具

参考资料

dbt/adapters/base/impl.py
https://docs.getdbt.com/reference/dbt-jinja-functions/adapter

posted on 2024-05-19 08:00  荣锋亮  阅读(8)  评论(0编辑  收藏  举报

导航