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   荣锋亮  阅读(9)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2022-05-18 openresty 1.21.4 发布了
2021-05-18 cube.js 响应内容压缩
2020-05-18 HAProxy Data Plane API 2.0 docker 镜像
2020-05-18 使用jetty runner 运行war 包
2020-05-18 winstone 简单方便的servlet 容器
2020-05-18 Announcing HAProxy Data Plane API 2.0
2019-05-18 使用go-mysql-server 开发自己的mysql server

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示