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

如何在dbt程序化调用中获取回调函数的返回值?

优雅获取dbt程序化调用中StatsLine事件的数据

在dbt-core 1.7.7里,程序化调用时的回调函数返回值不会被dbt保存,所以靠返回值拿数据是行不通的。不想用全局字典的副作用写法,可以试试下面两种更优雅的方式:

方式一:用闭包封装数据

闭包能让回调函数访问外部变量,不用全局变量,代码更整洁:

from dbt.cli.main import dbtRunner, dbtRunnerResult
from dbt.events.base_types import EventMsg

def create_stats_collector():
    stats_data = []
    def callback(event: EventMsg):
        if event.info.name == 'StatsLine':
            stats_data.append(event.data)
    return callback, stats_data

# 创建回调函数和存储数据的列表
stats_callback, collected_stats = create_stats_collector()

cli_args = ['run', '-m', 'my_model']
dbt = dbtRunner(callbacks=[stats_callback])
res = dbt.invoke(cli_args)

# 直接用collected_stats获取所有StatsLine数据
print(collected_stats)

方式二:用类管理状态

如果后续要扩展收集更多事件,用类封装会更清晰:

from dbt.cli.main import dbtRunner, dbtRunnerResult
from dbt.events.base_types import EventMsg

class StatsCollector:
    def __init__(self):
        self.stats = []
    
    def callback(self, event: EventMsg):
        if event.info.name == 'StatsLine':
            self.stats.append(event.data)

# 实例化收集器
collector = StatsCollector()

cli_args = ['run', '-m', 'my_model']
dbt = dbtRunner(callbacks=[collector.callback])
res = dbt.invoke(cli_args)

# 通过collector.stats拿到收集到的数据
print(collector.stats)

为什么回调返回值没用?

dbt的回调机制设计就是只执行回调函数,不会捕获或保存任何返回值,所以你在回调里返回的event.data不会被存到dbtRunnerResult或其他dbt返回的对象里,这就是你找不到返回值的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:35:58