2. dbt项目初始化与测试环境搭建

在正式编写测试之前,需要先把 dbt 的运行环境搭起来。这一节的目标很明确:让 dbt 能够连上数据仓库,跑通第一个模型,并执行第一条测试。整个过程可以拆成五件事——安装 dbt、配置连接、初始化项目、验证连接、运行模型与测试。下面按实际操作顺序展开。

一、选择 dbt Core 还是 dbt Cloud

dbt 有两种使用形态。dbt Core 是开源命令行工具,通过 pip 安装,适合本地开发、CI 集成和完全自定义的工作流;dbt Cloud 是托管服务,提供网页 IDE、调度器和作业管理,适合团队协作和不想维护本地环境的场景。两者使用同一套项目结构和 Jinja 语法,模型与测试代码可以互通,区别主要在运行方式和调度能力上。

本课程以 dbt Core 为主线,因为它更贴近工程实践,也便于观察每一步的输入输出。如果你使用 dbt Cloud,命令行的 dbt run、dbt test 对应网页上的 Run 和 Test 按钮,配置部分则由 Cloud 界面管理,逻辑一致。

二、安装 dbt Core 与适配器

dbt Core 本身不直接连接数据库,需要配合对应仓库的适配器。安装时通常一起装:

# 建议使用虚拟环境
python -m venv dbt-env
source dbt-env/bin/activate        # Windows: dbt-env\Scripts\activate

# 以 PostgreSQL 为例
pip install dbt-core dbt-postgres

# 验证安装
dbt --version

输出中会列出 dbt-core 版本和已安装的适配器。常见适配器还有 dbt-snowflake、dbt-bigquery、dbt-databricks 等,按你实际使用的仓库选择。安装完成后,dbt --version 能正常打印版本号,说明环境就绪。

三、配置 profiles.yml

dbt 通过 profiles.yml 知道“连哪个仓库、用什么账号”。它默认放在 ~/.dbt/ 目录下,与项目代码分离,避免把凭据提交到 Git。一个 PostgreSQL 的配置示例如下:

my_project:
  target: dev
  outputs:
    dev:
      type: postgres
      host: localhost
      port: 5432
      user: dbt_user
      password: "{{ env_var('DBT_PASSWORD') }}"
      dbname: analytics
      schema: dbt_dev
      threads: 4

几个关键点:target 指定当前使用哪个输出环境;outputs 下可以定义 dev、prod 等多套环境;schema 是 dbt 写入模型的目标 schema,建议 dev 与 prod 分开;threads 控制并行度,本地开发 4 左右即可。密码用 env_var() 从环境变量读取,是避免明文凭据的常见做法。

配置完成后,用 dbt debug 验证连接。它会检查 profiles.yml 是否存在、凭据是否有效、能否连上仓库。全部通过会显示 “All checks passed!”,这是进入下一步的前提。

四、初始化示例项目

用 dbt init 创建项目骨架:

dbt init my_project
cd my_project

生成的结构包含几个核心目录:models/ 放模型,tests/ 放自定义测试,dbt_project.yml 是项目主配置,seeds/ 用于加载 CSV 种子数据。打开 dbt_project.yml,确认 name 与 profiles.yml 中的顶层键一致,profile 字段指向正确的 profile 名。这一步对不上,后续命令会直接报 “Could not find profile”。

dbt 自带的示例项目通常包含 my_first_dbt_model.sql 和 my_second_dbt_model.sql,以及对应的 schema.yml。它们足够用来跑通第一条链路。

五、运行首个模型与测试

先跑模型:

dbt run

dbt 会编译模型中的 Jinja 与 SQL,按依赖顺序在仓库中创建视图或表。成功时日志显示 Completed successfully,并列出每个模型的执行状态。此时去仓库里查看 dbt_dev schema,应该能看到刚生成的模型对象。

再跑测试:

dbt test

dbt 会执行 schema.yml 中声明的测试,例如 unique、not_null、accepted_values、relationships。每条测试返回通过或失败,失败会给出具体行数和示例值。示例项目中通常已包含对主键的 unique 和 not_null 测试,跑通即说明测试链路可用。

如果想一次完成“加载种子数据 + 运行模型 + 执行测试”,可以用:

dbt build

dbt build 会按 DAG 顺序执行 seed、run、test,是日常开发中最常用的命令。它把模型和测试放在同一条依赖链里,某个模型测试失败时,下游依赖它的模型不会继续执行,这能尽早暴露数据问题。

dbt 环境搭建与首次运行链路 ① 安装 dbt Core pip install dbt-core + dbt-postgres 适配器 ② 配置 profiles.yml host / user / schema target: dev ③ dbt init 初始化 生成项目骨架 models/ tests/ seeds/ dbt debug 连接验证 All checks passed! 数据仓库 (PostgreSQL) schema: dbt_dev | threads: 4 dbt seed 加载 CSV 种子数据 → raw 表 dbt run 编译 Jinja + SQL → 视图/表 dbt test unique / not_null accepted_values dbt build(按 DAG 顺序执行 seed → run → test) 结果 PASS FAIL → 定位 关键判断:dbt debug 通过 → dbt run 成功 → dbt test 全部 PASS,环境即搭建完成

六、如何判断环境搭建成功

把上面几步串起来,判断标准可以归纳为三条:dbt debug 输出 “All checks passed!”;dbt run 日志中每个模型状态为 OK,且仓库里能看到对应对象;dbt test 所有测试返回 PASS。三条都满足,说明从本地到仓库的链路已经打通,可以开始写自己的模型和测试。

如果某一步失败,排查顺序建议是:先看 dbt debug 的连接报错(多半是 host、端口、密码或 schema 权限问题),再看 dbt run 的编译错误(SQL 语法或 ref 引用错误),最后看 dbt test 的失败详情(数据本身不满足约束)。把这三层分开定位,比一次性盯着日志找问题要高效得多。

不要把 profiles.yml 提交到版本库。凭据应通过环境变量或密钥管理工具注入,CI 环境中尤其要注意这一点。项目代码可以共享,连接配置必须隔离。