在DBT中如何使用Jinja遍历所有列?
DBT 场景下使用Jinja遍历数据表全列的实现方法
核心实现逻辑
DBT 内置的 adapter 接口提供了获取表结构的标准方法,跨数据源通用,是最稳妥的实现方案:
- 第一步:先获取目标表的关系对象,根据表的类型选择对应方法:
- 遍历dbt模型表:用
ref('你的模型名')关联 - 遍历原始源表:用
source('你的数据源名', '你的源表名')关联
- 遍历dbt模型表:用
- 第二步:调用
adapter.get_columns_in_relation()方法拿到表的全列信息数组 - 第三步:直接遍历数组即可拿到每一列的名称、类型等属性
基础代码示例
{# 1. 定义目标表 #} {% set target_table = ref('your_dbt_model') %} {# 2. 获取全列信息 #} {% set all_columns = adapter.get_columns_in_relation(target_table) %} {# 3. 遍历列执行你的业务逻辑 #} {% for col in all_columns %} -- 列名:{{ col.name }},字段类型:{{ col.data_type }} -- 此处可插入你需要的SQL逻辑,比如字段清洗、校验、聚合规则等 {% endfor %}
实际使用示例
比如需要统计一张用户表所有字段的非空值占比,最终生成的SQL会自动包含所有字段的统计逻辑:
SELECT {% set user_cols = adapter.get_columns_in_relation(ref('user_info')) %} {% for col in user_cols %} ROUND(COUNT({{ col.name }}) * 100.0 / COUNT(*), 2) AS {{ col.name }}_non_null_rate {% if not loop.last %},{% endif %} {% endfor %} FROM {{ ref('user_info') }}
注意事项
- 如果你在模型的
pre_hook/post_hook里使用该逻辑,要确保执行钩子的时候目标表已经存在,否则解析阶段会报找不到表结构的错误 - 列信息数组的每个元素除了
name、data_type外,部分数据源还支持获取is_nullable、numeric_precision等扩展属性,可根据实际需求调用
内容的提问来源于stack exchange,提问作者Nripesh Pradhan
相关产品推荐
相关产品推荐

