dbt Relation check_schema_exists 一个有意思的功能
dbt 内部总有一些隐藏的小细节,官方文档没有说明,但是在一些adapter 实现中包含,一些是关于check_schema_exists 的一些说明
内部处理
- dbt/adapters/sql/impl.py
def check_schema_exists(self, database: str, schema: str) -> bool:
information_schema = self.Relation.create(
database=database,
schema=schema,
identifier="INFORMATION_SCHEMA",
quote_policy=self.config.quoting,
).information_schema()
# 可以看到会包含一个INFORMATION_SCHEMA 信息,我们可以基于此使用标准的INFORMATION_SCHEMA 进行一些查询
kwargs = {"information_schema": information_schema, "schema": schema}
results = self.execute_macro(CHECK_SCHEMA_EXISTS_MACRO_NAME, kwargs=kwargs)
return results[0][0] > 0
- macro 处理
{% macro check_schema_exists(information_schema, schema) -%}
{{ return(adapter.dispatch('check_schema_exists', 'dbt')(information_schema, schema)) }}
{% endmacro %}
{% macro default__check_schema_exists(information_schema, schema) -%}
{% set sql -%}
select count(*)
# 此处replace 实际上是dbt 包装的一个replace 实现, information_schema_view 是InformationSchema的一个属性
from {{ information_schema.replace(information_schema_view='SCHEMATA') }}
where catalog_name='{{ information_schema.database }}'
and schema_name='{{ schema }}'
{%- endset %}
{{ return(run_query(sql)) }}
{% endmacro %}
参考基于data class 的调用
dbt 包装了一个data class 可以进行relation 的创建
- 参考使用
{% set relation = api.Relation.create(schema='appdemo', identifier='events') %}
{{log(relation,info=True)}}
{{log(relation.information_schema().replace(information_schema_view='TABLE'),info=True)}}
说明
dbt 隐藏一个小功能,还是比较有用的,对于实际使用也比较方便,dremio 对于schema 因为是不支持,支持基于python 代码实现了通过rest api 处理了
参考资料
dbt/adapters/sql/impl.py
dbt/adapters/base/relation.py
dbt/adapters/dremio/impl.py
dbt/include/global_project/macros/adapters/metadata.sql
https://docs.getdbt.com/reference/dbt-classes