dbt_expectations.expect_column_to_exist测试新增列失败问题求助
dbt_expectations.expect_column_to_exist测试新增列失败的排查方案
问题场景
在dbt模型中使用dbt_expectations.expect_column_to_exist做单元测试时,已有列的测试能正常通过,但新增列的测试始终失败。直接查询数据库、在dbt analysis文件夹执行select * from model均能看到该新增列。
用户的测试配置代码:
models: - name: site columns: - name: site_id tests: - dbt_expectations.expect_column_to_exist - dbt_expectations.expect_column_values_to_be_of_type: column_type: string - dbt_expectations.expect_column_values_to_match_regex: regex: "[a-zA-Z0-9]{8}"
可能的原因及解决办法
1. dbt模型元数据缓存未更新
dbt会缓存模型的结构元数据,新增列后如果未重新生成模型,测试可能仍基于旧的元数据执行。
- 解决:执行全量刷新重新生成模型,再运行测试:
或者直接删除dbt的dbt run --full-refresh dbt test --select sitetarget文件夹(缓存目录),再重新执行dbt run和dbt test。
2. 测试指向的环境/数据库与查询的不一致
可能dbt测试连接的数据库/schema和你手动查询的不是同一个,导致测试看不到新增列。
- 解决:检查
profiles.yml中的目标数据库、schema配置,确认和你查询的环境一致;如果使用多环境,确保测试时指定了正确的--target参数,比如:dbt test --select site --target dev
3. dbt_expectations版本存在兼容性问题
部分旧版本的dbt_expectations在读取新增列的元数据时存在bug,导致测试误判。
- 解决:升级dbt_expectations到最新稳定版本:
- 修改
packages.yml中的版本号,例如:packages: - package: calogica/dbt_expectations version: [">=0.10.0", "<0.11.0"] - 执行
dbt deps更新依赖,之后重新运行测试。
- 修改
4. 列名大小写不匹配
如果你的数据库是大小写敏感的(比如PostgreSQL、Snowflake在特定配置下),测试配置中的列名和数据库实际列名大小写不一致会导致测试失败。
- 解决:查询数据库确认列的实际大小写(比如执行
select column_name from information_schema.columns where table_name = 'site'),确保测试配置中的name字段和实际列名完全一致;必要时在列名上添加双引号(需符合数据库语法)。
内容的提问来源于stack exchange,提问作者Naman Singh Bhandari
相关产品推荐
相关产品推荐

