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