dbt宏引用ephemeral模型报错:需为__dbt__cte__tablexxx指定数据集
问题原因
ephemeral类型模型的本质是仅在引用它的父模型主SQL中生成CTE,而statement/run_query执行的是独立于父模型的查询,这个独立查询的上下文里没有定义对应CTE,因此数据库会认为__dbt__cte__tablexxx是未指定数据集的无效表,导致报错。
解决方案
以下两种方案均能保留ephemeral模型特性,同时解决宏查询的CTE缺失问题:
方案1:宏直接查询源表(推荐)
由于你的ephemeral模型逻辑就是select * from source('src1', 'tablexxx'),宏可以跳过引用模型,直接查询源表,彻底避开CTE依赖问题。
调整增量模型代码
将模型配置改为传递源库和源表名称:
{{ get_changed_partitions_where( [ { "source_name": "src1", "table_name": "tablexxx", "partition_col": "date", "load_time_col": "last_updated" } ] ) }}
修改宏代码
直接使用source()引用源表:
{% macro get_changed_partitions_where(table_config) %} {%- call statement('date_filter', fetch_result=True) -%} {% for config in table_config %} select distinct cast({{ config.partition_col }} as string) from {{ source(config.source_name, config.table_name) }} where {{ config.load_time_col }} = current_date() {% if not loop.last %} UNION DISTINCT {% endif %} {% endfor %} {%- endcall -%} {% endmacro %}
方案2:宏内嵌入ephemeral模型的CTE定义
如果必须依赖ephemeral模型的逻辑(比如模型有复杂转换而非简单的select *),可以在宏的statement块中手动生成该模型的CTE:
修改宏代码
通过load_file()加载ephemeral模型的SQL文件,在独立查询中先定义CTE再查询:
{% macro get_changed_partitions_where(table_config) %} {%- call statement('date_filter', fetch_result=True) -%} -- 先定义所有需要的ephemeral模型CTE with {% for config in table_config %} {{ config.table }} as ( {{ load_file(config.table ~ '.sql') }} ) {% if not loop.last %},{% endif %} {% endfor %} -- 执行日期查询 {% for config in table_config %} select distinct cast({{ config.partition_col }} as string) from {{ config.table }} where {{ config.load_time_col }} = current_date() {% if not loop.last %} UNION DISTINCT {% endif %} {% endfor %} {%- endcall -%} {% endmacro %}
注意事项
load_file()会加载对应模型的SQL文件内容,需确保模型文件路径正确(默认是models/目录下的文件)。- 增量模型中传递的
table参数需为模型文件名(不带.sql后缀),例如:{{ get_changed_partitions_where( [ { "table": "stg_smt__model", "partition_col": "date", "load_time_col": "last_updated" } ] ) }}
关键注意点
- 不要直接传递
dataset.tablexxx字符串给ref():ref()接受的是dbt模型名,而非数据库中的物理表名,传物理表名会导致解析失败返回None。 - ephemeral模型的CTE仅在父模型主SQL中生效,无法被独立的
statement/run_query查询复用,这是dbt的设计特性。
内容的提问来源于stack exchange,提问作者AlienDeg
相关产品推荐
相关产品推荐

