
一个 Apache 2.0 的下一代数据转换框架——进 Linux Foundation、Plan/Apply 工作流 (像 Terraform 那样审变更)、 虚拟数据环境(VDE,不吃数仓成本)——dbt 终于迎来一个认真的挑战者。
写在前面
dbt 是 ELT 时代 ”T” 环节的事实标准。但用了几年 dbt 的人都知道三个老毛病:
- 开发环境贵:每个开发者要在 Snowflake 里建一套 dev schema,跑一次完整 pipeline 烧掉几十美元
- 变更影响靠脑补:改一个 model 不知道会炸多少下游表,” 改 SQL 怕改错 ”
- Jinja + YAML 模板杂烩:dbt 项目里 Jinja 满天飞,新人第一周都在学模板语法
2026 年 8 月,sqlmesh 已经在 Linux Foundation 旗下,v0.236.x(仍在快速迭代),Apache 2.0 协议。它的三个核心设计直接对位上面三个痛点:
- 虚拟数据环境(VDE):开发者的 SQL 通过 SQLMesh 引擎代理,零额外数仓成本
- Plan / Apply(像 Terraform):改 SQL 前先 plan,看影响范围 + 自动生成的 diff,apply 才真正执行
- 纯 SQL 配置:
MODEL(...)macro 在 SQL 文件顶部声明元数据,没有 Jinja 模板也能写
要不要从 dbt 迁移?还是从今天起新项目用 sqlmesh?这是每个数据团队都要面对的问题。
一、它解决什么问题
一句话卖点 :用纯 SQL(或 Python)写数据模型,SQLMesh 自动帮你做环境隔离 + 变更预览 + 增量追踪 + 列级血缘, 不污染生产数仓。
基本信息
| 字段 | 值 |
|---|---|
| 项目名 | sqlmesh |
| 仓库 | SQLMesh/sqlmesh(旧路径 TobikoData/sqlmesh 已重定向) |
| 协议 | Apache License 2.0(代码)/ CC-BY-4.0(文档) |
| 最新版本 | v0.236.1(2026 年 7 月,仍在快速迭代) |
| 治理 | Linux Foundation 项目 |
| 商业实体 | Tobiko Data(核心贡献者,提供 Tobiko Cloud SaaS) |
| 安装 | pip install 'sqlmesh[lsp]'(PyPI) |
| VS Code | 官方扩展(列级血缘、自动补全) |
关键信号:Linux Foundation 接管的次年(2025 启动),sqlmesh 摆脱了 ” 单一公司项目 ” 的标签,进入基金会治理——这意味着大厂可以放心贡献代码,不会被 Tobiko 绑架。
二、核心能力:六件 sqlmesh 干得比 dbt 漂亮的事
1. 虚拟数据环境(VDE)—— 0 成本隔离
dbt 的开发工作流是 ” 每个开发者一份 dev schema”——跑一次完整 pipeline 烧钱。SQLMesh 用 虚拟数据环境:
- 你的 SQL 通过 sqlmesh 引擎跑,不直接写入数仓
- 数据请求按需从生产数仓 ” 借 ” 过来(time-travel 查询)
- 只有你
sqlmesh plan+apply之后,改动才落到真实表
效果:开发环境 0 数仓成本,CI 也一样。Tobiko 官方博客声称可以为大团队节省 70%+ 数仓账单。
2. Plan / Apply 工作流 —— 像 Terraform 那样审变更
$ sqlmesh plan dev
输出不是 ” 开始跑了 ”,而是:
Summary of differences:
Models:
├── stg_orders [ADDED] → forward-only
├── fct_revenue [NON-BREAKING] → add column `tax_amount`
└── dim_customers [BREAKING] → change grain
Direct local changes: 3
Indirect via depends_on: 17
Virtual update: 12
Approve? [y/n]
每个 model 标 [ADDED] / [NON-BREAKING] / [BREAKING],告诉你会不会炸下游 。点击 y 才真正执行。这是 Git PR review 思维的延伸—— 变更影响可视化。
3. 纯 SQL 配置 —— 不要 Jinja 模板
dbt 的 model 长这样(要懂 Jinja):
{{config(materialized='incremental', unique_key='order_id') }}
SELECT * FROM {{ref('stg_orders') }}
WHERE order_date > '{{var("start_date") }}'
sqlmesh 的 model 长这样(纯 SQL):
MODEL (
name tcloud_demo.fct_orders,
cron '@daily',
grain order_id,
audits (UNIQUE_VALUES(columns = (order_id)), NOT_NULL(columns = (order_id)))
);
SELECT * FROM tcloud_demo.stg_orders
WHERE order_date > @start_date
MODEL(...) 是 SQLMesh 的声明式 macro,所有 metadata 都在 SQL 文件里。新人不用学 Jinja 也能上手。
4. 不再冗余建表 —— 智能增量
dbt 的 incremental model 每跑一次都会对比 unique_key。但 sqlmesh 更激进:
- Track 哪些 data 已经被 processed(基于 time column + grain)
- 只跑真正需要的 transformation(数据没变就不重跑)
- 跨多个 incremental models 联动追踪
官方博客原话:”Never build a table more than once”——同一张表不被多次 build。
5. 内置单元测试 —— 像 pytest 那样写
$ sqlmesh create_test tcloud_demo.stg_payments --query tcloud_demo.seed_raw_payments "select * ... limit 5"
$ sqlmesh test
自动从种子数据生成测试 fixture,写到 tests/test_stg_payments.yaml,然后 sqlmesh test 跑全套。比 dbt 的 dbt test 早 5 年就有了 data-diff unit test 范式。
6. 多方言 transpile —— 一次写,到处跑
写 Snowflake 方言 SQL,sqlmesh 编译时 transpile 到 BigQuery / Databricks / Redshift / DuckDB / Postgres / MySQL / MSSQL / T-SQL / Spark / Trino 等 10+ 方言。dbt 没有这种 ” 编译期 transpile” 能力——dbt adapter 只是连接驱动,方言得你自己处理。
三、执行引擎支持
SQLMesh 在 执行引擎层 抽象,不绑定特定数仓:
| 引擎 | 用途 |
|---|---|
| DuckDB | 本地开发默认,零依赖(sqlmesh init 选 DuckDB 立即跑通) |
| Snowflake | 云数仓 |
| BigQuery | 谷歌云 |
| Databricks | Spark + Delta |
| Redshift | AWS |
| PostgreSQL | 自托管 |
| MySQL | 自托管 |
| MSSQL | 企业 |
| Trino / Presto | 查询联邦 |
| Spark | 大数据 |
| ClickHouse | OLAP |
| MotherDuck | 云 DuckDB |
DuckDB-first 哲学:官方 quickstart 默认 DuckDB,1 分钟跑通——比 dbt 装一堆 adapter 友好得多。
四、与 dbt-core 详细对比
| 维度 | dbt-core(v1.x) | dbt-core(v2.0 alpha) | sqlmesh |
|---|---|---|---|
| 协议 | Apache 2.0 | Apache 2.0 | Apache 2.0 |
| 治理 | dbt Labs(公司) | dbt Labs(公司) | Linux Foundation ✅ |
| 核心语言 | Python | Rust(重写中) | Python |
| 模型定义 | SQL + Jinja + YAML | 同 v1 | 纯 SQL + MODEL macro ✅ |
| 环境隔离 | dev schema(烧钱) | 同 v1 | VDE(零成本) ✅ |
| 变更审查 | 无 | state:modified 增量 | Plan / Apply ✅ |
| 单元测试 | dbt-utils 包 | 同 | 内置 + data fixture ✅ |
| 多方言 transpile | 无 | 无 | 10+ 方言内置 ✅ |
| 不冗余建表 | 需要配置 | 同 | 内置智能追踪 ✅ |
| LSP / VS Code | 第三方扩展 | Fusion 自带 LSP | 官方扩展 ✅ |
| 调度 | 自己接 | 同 / dbt Cloud | 自己接 / Tobiko Cloud |
| 商业产品 | dbt Cloud | dbt Cloud | Tobiko Cloud |
| 生态成熟度 | 100K+ 社区 ✅ | 继承 v1 | 5K+ 社区,快速增长 |
| 文档 | 完整 | 完整 | 完整 |
| 学习曲线 | 中(Jinja + YAML) | 继承 | 低(纯 SQL) ✅ |
五、Tobiko Cloud —— 商业那部分
SQLMesh 核心 Apache 2.0 全开源,商业产品是 Tobiko Cloud:
- Web UI:Plan/Apply 可视化(浏览器里审变更)
- Scheduler:Airflow / Dagster 集成
- CI/CD Bot:GitHub 集成,蓝绿部署
- 跨仓库协作:跨 SQLMesh 项目的环境共享
Tobiko 创始人是前 Airbnb 数据工程师,团队规模小但 技术深度被 dbt 创始人公开认可(dbt 文档里多次引用 sqlmesh 设计理念作为对比)。
六、实战:3 步跑通 sqlmesh
# 1. 装 + 起项目(默认 DuckDB,零数仓成本)mkdir sqlmesh-example && cd sqlmesh-example
python -m venv .venv
source .venv/bin/activate
pip install 'sqlmesh[lsp]'
sqlmesh init # 选 DuckDB,跟着提示走
# 2. 写第一个 model(models/stg_payments.sql)cat > models/stg_payments.sql << 'EOF'
MODEL (
name tcloud_demo.stg_payments,
cron '@daily',
grain payment_id,
audits (UNIQUE_VALUES(columns = (payment_id)),
NOT_NULL(columns = (payment_id)))
);
SELECT id AS payment_id, order_id, payment_method,
amount / 100 AS amount
FROM tcloud_demo.seed_raw_payments
EOF
# 3. plan + apply + 测
sqlmesh plan dev # 看变更影响 + 列级血缘
sqlmesh apply # 批准后执行
sqlmesh create_test tcloud_demo.stg_payments --query ... # 生成测试
sqlmesh test # 跑测试
跑通后 VS Code 装 SQLMesh 扩展,能拿到列级血缘、自动补全、plan 模式 UI。
七、风险与坑
- 生态小:5K+ 社区 vs dbt 100K+——招人难、Stack Overflow 答案少、第三方包少
- 项目年轻 :v0.236.x(0.x 版本),API 还在变, 生产锁定建议钉版本
- 调度自己接:sqlmesh 不内置调度,要 Airflow / Dagster / Tobiko Cloud
- VDE 的局限:time-travel 查询要数仓支持;老 Snowflake/Redshift 实例可能有兼容问题
- dbt 迁移成本 :已有 dbt 项目,sqlmesh 提供 dbt 项目 兼容读取(不是迁移),但建议新建项目用
- Tobiko 商业绑定:虽然进 Linux Foundation,但核心贡献者仍是 Tobiko 团队;dbt Labs 那种 ” 公司垄断 ” 风险还在
- 单元测试 fixture 体积:大表测试 fixture 文件可能很大,CI 要注意
- Python model 支持:sqlmesh 支持 Python model,但 Python 生态不如 dbt-ml / dbt-external-packages 成熟
八、总结
3 个最值得装的理由:
- Linux Foundation 接管 + Apache 2.0:治理风险显著低于 dbt(dbt Labs 单一公司控制);基金会项目可以放心上生产
- Plan/Apply + VDE 工作流:彻底改变 ” 改 SQL 怕改错 ” 的现状;开发成本接近 0
- 纯 SQL + 多方言 transpile:新人上手快(不用学 Jinja);一次 SQL 多数仓可用
一句话建议:
新项目从今天起直接用 sqlmesh + DuckDB 起步;如果团队 dbt 资产重,不要急着迁——但新模块建议用 sqlmesh 试点,3 个月评估迁移 ROI。
参考
- SQLMesh/sqlmesh · GitHub — 主仓库(已从 TobikoData 重命名)
- SQLMesh 文档 — 官方文档
- Linux Foundation — sqlmesh 治理方
- Tobiko Cloud — 商业 SaaS
- Plan/Apply 工作流详解 — 架构图
- dbt vs sqlmesh 功能对比 — Tobiko 官方博客
- We Need Even Greater Expectations — sqlmesh 单元测试设计
- Apache 2.0 License — 协议全文