You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在DBT中如何使用Jinja遍历所有列?

DBT 场景下使用Jinja遍历数据表全列的实现方法

核心实现逻辑

DBT 内置的 adapter 接口提供了获取表结构的标准方法,跨数据源通用,是最稳妥的实现方案:

  • 第一步:先获取目标表的关系对象,根据表的类型选择对应方法:
    • 遍历dbt模型表:用 ref('你的模型名') 关联
    • 遍历原始源表:用 source('你的数据源名', '你的源表名') 关联
  • 第二步:调用 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:36:04