DBT自定义记录数测试编译错误:macro不接受'model'参数
错误原因解析
编译错误的核心是:DBT执行model级自定义测试时,会自动向测试宏传递model参数,但你的宏定义未声明接收该参数,导致参数不匹配;同时宏内部引用了未定义的model变量,进一步引发问题。
修复步骤
1. 修改自定义测试宏(test_record_count.sql)
调整宏参数列表,添加DBT自动传递的model参数,同时修正测试逻辑使其符合DBT测试规范:
{% test record_count(model, source_name, source_table) %} WITH source_count AS ( SELECT COUNT(*) AS record_count FROM {{ source(source_name, source_table) }} ), model_count AS ( SELECT COUNT(*) AS record_count FROM {{ model }} ) -- 记录数不匹配时返回错误信息,触发测试失败;匹配时无结果,测试通过 SELECT '记录数不匹配:源表有 ' || s.record_count || ' 行,模型表有 ' || m.record_count || ' 行' AS error_message FROM source_count s CROSS JOIN model_count m WHERE s.record_count != m.record_count {% endtest %}
2. 更新Schema配置(schema.yml)
由于测试直接绑定在目标model上,无需手动传递model_name参数,简化配置:
- name: prontoform_prod_lptr_grower description: 'Mapping ids to question labels' data_tests: - record_count: source_name: "LPTR_GROWER_RAW_SUBMISSIONS" source_table: "RAW_SUBMISSIONS" columns: - name: submission_id description: 'submission_id of form' data_tests: - not_null - unique - name: question_id description: 'Unique question ID used for mapping' data_tests: - not_null - name: question_label description: 'The label of the question' data_tests: - not_null
3. 验证修复
重新执行测试命令:
dbt test --select prontoform_prod_lptr_grower
关键说明
- DBT的model级自定义测试默认会注入
model参数,代表当前测试绑定的模型,无需手动传递。 - 测试逻辑调整为记录数不匹配时返回结果:DBT测试规则是返回0行则通过,返回任意行数则失败,该逻辑更贴合官方规范。
- 移除了冗余的
model_name参数,避免变量混淆。
内容的提问来源于stack exchange,提问作者Pardeep Singh
相关产品推荐
相关产品推荐

