dbt-expectations的timestamptz类型校验为何异常失败?
问题原因解析
数据库类型的标准名称与别名不统一:以PostgreSQL为例,
TIMESTAMPTZ是TIMESTAMP WITH TIME ZONE的简写别名,但数据库元数据(比如information_schema.columns表)里存储的是类型的标准全称,而非别名。你在DBeaver看到的timestamptz是工具对标准名称的友好显示,不是数据库底层存储的原始类型字符串。dbt_expectations的类型校验是精确字符串匹配:
expect_column_values_to_be_of_type测试会直接读取数据库元数据中的data_type字段值,再和你在schema.yml里指定的类型字符串做严格比对。当你写timestamptz时,测试逻辑会判断元数据返回的TIMESTAMP WITH TIME ZONE是否不在指定的类型列表里,自然触发失败。timestamp类型的问题同理:数据库里
TIMESTAMP的标准全称是TIMESTAMP WITHOUT TIME ZONE,元数据返回的是这个全称,和你指定的timestamp字符串不匹配,导致校验失败。
临时解决办法
- 直接使用数据库的标准类型名称做校验:比如把schema.yml里的校验类型改成
TIMESTAMP WITH TIME ZONE(对应timestamptz)或TIMESTAMP WITHOUT TIME ZONE(对应timestamp)。 - 或者用
expect_column_values_to_match_regex替代,写正则匹配类型名称,比如^TIMESTAMP( WITH TIME ZONE)?$来兼容两种情况。
内容的提问来源于stack exchange,提问作者GoneAsync
相关产品推荐
相关产品推荐

