dbt自定义通用测试is_even运行报错:语法错误,意外出现'%'
dbt自定义测试is_even语法错误排查与解决
问题现象
运行dbt test执行自定义通用测试is_even时,触发数据库语法错误:
Database Error in test is_even_my_first_dbt_model_id (models/example/schema.yml)
Syntax error: Unexpected "%" at [25:23]
测试代码test_is_even.sql内容如下:
{% test is_even(model, column_name) %} with validation as ( select {{ column_name }} as even_field from {{ model }} ), validation_errors as ( select even_field from validation -- if this is true, then even_field is actually odd! where (even_field % 2) = 1 ) select * from validation_errors {% endtest %}
问题原因
%是PostgreSQL、MySQL等数据库的取余运算符,但你的目标数据库(比如BigQuery、Snowflake)不支持该语法,需要用MOD()函数实现取余逻辑。
解决方案
使用dbt内置的跨数据库兼容宏mod替代%运算符,确保测试代码适配不同类型数据库。修改后的代码如下:
{% test is_even(model, column_name) %} with validation as ( select {{ column_name }} as even_field from {{ model }} ), validation_errors as ( select even_field from validation -- 成立则说明字段值为奇数 where {{ mod('even_field', 2) }} = 1 ) select * from validation_errors {% endtest %}
如果项目固定使用某一种数据库,也可以直接写对应数据库的原生语法,比如BigQuery/Snowflake环境下:
where MOD(even_field, 2) = 1
优先推荐使用dbt的mod宏,它会根据dbt_project.yml中配置的target数据库,自动生成适配的取余语法,避免跨数据库适配问题。
内容的提问来源于stack exchange,提问作者Tushaar
相关产品推荐
相关产品推荐

