dbt通用测试内部执行失败:返回0行却预期1行,求解决方案
解决dbt测试报错:
Returned 0 rows, but expected 1 row 1. 检查自定义通用测试的逻辑是否写反
如果是你自己编写的no_nulls类通用测试宏,大概率是断言逻辑搞反了:
- 错误逻辑示例:测试查询目标是统计无null值的行,但dbt默认通用测试的通过条件是「返回0行」(即不存在不符合规则的数据),这种情况下若表无null值或为空,就会触发报错。
{% macro test_no_nulls(model, column_name) %} select count(*) as count from {{ model }} where {{ column_name }} is not null {% endmacro %}
- 修正逻辑:测试查询应定位存在null值的行,只要返回0行(无违规数据),测试就会通过。
{% macro test_no_nulls(model, column_name) %} select {{ column_name }} from {{ model }} where {{ column_name }} is null {% endmacro %}
2. 确认目标模型是否有数据
如果dim_listings_cleansed模型是空表,即使测试逻辑正确,也可能因无数据返回0行触发报错:
- 执行
dbt run --select dim_listings_cleansed,确认模型是否生成有效数据; - 检查模型SQL的过滤条件,是否因规则过严导致无输出。
3. 排查测试配置与权限问题
如果使用dbt自带的not_null测试(通过schema.yml配置),报错可能源于:
- 版本兼容问题:升级dbt对应数据库适配器到最新稳定版;
- 数据库权限:手动在数据库执行测试对应SQL(如
select listing_id from dbtlearn.dim_listings_cleansed where listing_id is null),确认是否有权限访问该表、能否正常返回结果。
4. 检查测试与模型的引用正确性
确认测试名称no_nulls_in_dim_listings_cleansed对应的宏存在,模型dim_listings_cleansed在项目中定义正确,无拼写错误。
内容的提问来源于stack exchange,提问作者t0rres
相关产品推荐
相关产品推荐

