You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 15:30:52