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

posted on 2024-05-18 06:07  荣锋亮  阅读(8)  评论(0编辑  收藏  举报

导航