测试 SQL:dbt 测试与 Great Expectations
使用 dbt(unique、not_null、accepted_values)编写数据质量测试,并使用 Great Expectations 编写更丰富的断言
测试 SQL:dbt 测试与 Great Expectations 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
为什么要测试 SQL
糟糕的数据在导致错误决策之前往往不可见。测试可以发现:
- 架构漂移(列被删除、类型发生变化)
- 数据质量问题(禁止出现 NULL 的地方有 NULL、重复值、超出范围的值)
- 引用关系问题(孤立行)
- 业务不变量(收入 ≥ 0、总计相加结果正确)
dbt 内置测试
在 YAML 中按列声明:
# models/orders.yml
version: 2
models:
- name: orders
columns:
- name: id
tests:
- unique
- not_null
- name: user_id
tests:
- not_null
- relationships:
to: ref('users')
field: id
- name: status
tests:
- accepted_values:
values: ['pending', 'paid', 'cancelled']运行 dbt 测试
执行所有测试:
dbt test
dbt test --select orders
dbt build # = run + test自定义单一测试
测试其实就是一个在失败时返回行的 SELECT 查询:
-- tests/no_negative_totals.sql
SELECT id, total
FROM {{ ref('orders') }}
WHERE total < 0通用测试
参数化测试,可在多列之间复用:
-- tests/generic/test_in_range.sql
{% test in_range(model, column_name, min, max) %}
SELECT * FROM {{ model }}
WHERE {{ column_name }} < {{ min }} OR {{ column_name }} > {{ max }}
{% endtest %}
-- Use it in YAML:
columns:
- name: age
tests:
- in_range:
min: 0
max: 120dbt-utils 软件包
增加更多测试:唯一组合、表达式为真、行数相等等:
- dbt_utils.expression_is_true:
expression: "revenue >= 0"
- dbt_utils.equal_rowcount:
compare_model: ref('staging_orders')Great Expectations
更重量级的替代方案——一个 Python 框架,拥有丰富的期望库和详细的报告:
import great_expectations as ge
suite = context.add_or_update_expectation_suite('orders')
batch = context.get_validator(batch_request, expectation_suite_name='orders')
batch.expect_column_values_to_not_be_null('id')
batch.expect_column_values_to_be_between('total', 0, 10000)
results = context.run_checkpoint('orders_checkpoint')何时使用各工具
- dbt 测试 — 如果您已经在使用 dbt,这是首选;轻量、仅使用 SQL
- Great Expectations — 如果您需要详细报告、更广泛的断言,或 SQL 之外的格式(CSV/parquet)
测试严重级别
dbt 1.0+ 支持警告与错误严重级别:
- accepted_values:
values: [...]
config:
severity: warn
warn_if: ">100"
error_if: ">1000"CI 集成
在每个 PR 中运行测试——失败时阻止合并:
# GitHub Actions
- run: dbt deps && dbt build --profiles-dir profiles
- if: failure()
run: echo "::error::dbt tests failed"数据质量仪表板
dbt-utils + dbt-expectations + Elementary 可以将测试结果转换为 Grafana / Looker 仪表板。
架构测试与行测试
使用 dbt 对列类型的“快照”捕获架构回归;行测试则捕获数据错误。
回顾
测试把 SQL 从“相信我”变成“已验证”。
- 使用 dbt 测试进行声明式、数据仓库内的测试
- 使用 Great Expectations 进行更广泛、更丰富的测试
- 在 CI 中运行;失败时阻止后续流程
- 持续跟踪结果
快速检查
您想要一个在任意行的 total < 0 时失败的 dbt 测试。最简单的方法是什么?
常见问题解答
「测试 SQL:dbt 测试与 Great Expectations」课时是免费的吗?
是的 — 「测试 SQL:dbt 测试与 Great Expectations」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「测试 SQL:dbt 测试与 Great Expectations」这节课中我会学到什么?
使用 dbt(unique、not_null、accepted_values)编写数据质量测试,并使用 Great Expectations 编写更丰富的断言 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「测试 SQL:dbt 测试与 Great Expectations」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- DBT(数据构建工具)基础
- SQLFluff 与代码检查
- 测试 SQL:dbt 测试与 Great Expectations
- 模式变更的 CI(GitHub Actions)