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

如何让dbt macro返回纯数据列表而非带agate.Row前缀的结果?

解决dbt宏中run_query返回agate.Row前缀的问题

你用run_query执行查询后返回的是agate.Table对象,直接返回会显示agate.Row前缀,需要提取行内的纯字段值,以下是两种可行的处理方案:

方案一:遍历行提取值(直观写法)

{% macro customer_id_fetcher() %}
{% set query %}
select distinct customer_id from {{ ref('table_name') }}
{% endset %}

{% set result = run_query(query) %}

{% if result %}
    {% set customer_ids = [] %}
    {% for row in result.rows %}
        {% do customer_ids.append(row.customer_id) %}
        <!-- 也可以用索引方式:row[0],适合不确定字段名的场景 -->
    {% endfor %}
    {{ return(customer_ids) }}
{% else %}
    {{ return([]) }}
{% endif %}
{% endmacro %}

关键说明:

  • result.rows获取所有行的迭代器,每个元素是agate.Row对象
  • 通过row.字段名或row[索引]提取纯值
  • 用{% do %}语句往空列表中添加元素(Jinja不能直接调用列表append方法,需要do关键字)
  • 增加空结果判断,避免无数据时触发报错

方案二:用Jinja过滤器简化写法

{% macro customer_id_fetcher() %}
{% set query %}
select distinct customer_id from {{ ref('table_name') }}
{% endset %}

{% set result = run_query(query) %}

{{ return(result.rows | map(attribute='customer_id') | list if result else []) }}
{% endmacro %}

关键说明:

  • map(attribute='customer_id')过滤器遍历所有行,提取指定字段的值
  • | list把过滤后的结果转换成标准列表
  • 三元表达式处理空结果,直接返回空列表

内容的提问来源于stack exchange,提问作者mikelowry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:04:58