0Pricing
SQL Academy · 课时

测试 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: 120

dbt-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 反馈 — 无需本地设置。

此课程中的所有课时

  1. DBT(数据构建工具)基础
  2. SQLFluff 与代码检查
  3. 测试 SQL:dbt 测试与 Great Expectations
  4. 模式变更的 CI(GitHub Actions)
← 返回 SQL Academy