Atlas 怎么只生成 schema diff SQL 而不直接修改数据库
如果你只想知道“当前数据库”和“目标 schema”之间需要执行哪些 SQL,Atlas 应该使用 atlas schema diff,而不是 atlas schema apply。前者读取两个 schema 状态并打印迁移计划,后者才会把计划应用到目标数据库。
官方地址:https://atlasgo.io/
这篇用一个可审阅的迁移场景说明完整做法:准备 --from、--to 和 --dev-url,生成 SQL,保存到 diff.sql,再根据输出判断是否存在 ALTER、CREATE 或 DROP。命令只负责计算和展示,不直接修改目标数据库。
先分清三个输入来源
atlas schema diff 的核心是比较两个状态:
--from:当前状态,可以是数据库 URL、HCL/SQL schema 或迁移目录。--to:期望状态,同样可以来自数据库、文件或迁移目录,并且可以重复传入。--dev-url:Atlas 用来解析和规划差异的开发数据库。它不是要被修改的生产库。
例如,当前状态来自本地 MySQL,目标状态来自 schema.hcl:
# 只声明差异来源和目标状态,不执行任何 ALTER 或 CREATE atlas schema diff \ --from "mysql://user:pass@localhost:3306/app" \ --to "file://schema.hcl" \ --dev-url "docker://mysql/8/dev"

界面说明图里最重要的是三个输入框的职责:from 描述“现在是什么”,to 描述“希望变成什么”,dev-url 提供规划所需的数据库类型和能力。不要把生产连接串当作开发数据库地址,也不要把 --from 与 --to 反过来。
用 schema diff 只生成 SQL 计划
最小命令已经会把差异计划打印到标准输出。Atlas 官方对该命令的定位是:读取两个 schema 定义,计算差异,并打印把 from 迁移到 to 所需的 SQL 语句。
如果只想查看结果,可以直接运行:
# 预览当前状态到目标状态的迁移 SQL;不会替目标数据库执行
atlas schema diff \
--from "file://schema-current.sql" \
--to "file://schema-next.sql" \
--dev-url "docker://mysql/8/test"
# 需要机器可读或统一缩进时,用模板控制输出格式
atlas schema diff \
--from "file://schema-current.sql" \
--to "file://schema-next.sql" \
--dev-url "docker://mysql/8/test" \
--format '{{ sql . " " }}'
输出中的 ALTER 通常表示已有对象定义发生变化,CREATE 表示目标状态新增对象,DROP 表示当前状态存在而目标状态没有的对象。它们是计划文本,不等于已经在数据库里执行成功。
把预览结果保存成 diff.sql
把输出落盘后,评审人可以在合并请求中直接查看 SQL。下面的重定向只保存命令输出,仍然没有执行数据库变更:
# 将 SQL 计划保存为评审文件,便于提交到代码仓库
atlas schema diff \
--from "mysql://user:pass@localhost:3306/app" \
--to "file://schema.hcl" \
--dev-url "docker://mysql/8/dev" \
--format '{{ sql . " " }}' > diff.sql
# 只读查看文件内容,确认计划中有哪些 DDL
sed -n '1,220p' diff.sql
如果两个状态相同,Atlas 会提示没有需要变更的内容;这时不要为了“得到一条 SQL”而强行修改 schema。空 diff 本身就是一个有用的结果,说明当前状态已经与目标状态同步。

只看部分对象时使用 include 和 exclude
大型 schema 不适合一次把所有对象混在一起评审,可以用过滤条件缩小范围:
# 只保留 users 相关对象,先聚焦一组表的差异 atlas schema diff \ --from "file://schema-current.sql" \ --to "file://schema-next.sql" \ --dev-url "docker://mysql/8/test" \ --include "users*" # 排除备份表,避免无关对象干扰本次审阅 atlas schema diff \ --from "file://schema-current.sql" \ --to "file://schema-next.sql" \ --dev-url "docker://mysql/8/test" \ --exclude "*_backup"
过滤后要记住:结果只代表当前筛选范围。被 exclude 排除的表不会出现在这份 SQL 中,不代表它们没有差异。
不要把四个命令混为一谈
| 命令 | 主要结果 | 是否直接改目标数据库 |
|---|---|---|
atlas schema diff | 打印两个 schema 之间的 SQL 差异 | 否 |
atlas schema plan | 预先生成并评审声明式迁移计划 | 否 |
atlas schema apply | 规划并执行 schema 变更 | 是 |
atlas migrate diff | 根据迁移目录和目标状态生成新的迁移文件 | 通常不直接改目标库 |
因此,标题中的“只生成 SQL”对应的是 schema diff。如果你的团队需要把 SQL 作为带时间戳的版本文件管理,才考虑 migrate diff;如果目的是把期望 schema 落到数据库,才进入 schema apply,并在共享环境中保留人工审批。
最后按四项确认结果
- 确认
--from是当前状态,--to是目标状态,方向没有颠倒。 - 确认
--dev-url只用于解析和规划,命令中没有误放生产写入地址。 - 打开
diff.sql,逐条检查ALTER、CREATE、DROP以及是否误包含被排除对象。 - 确认本次只运行了
schema diff,没有在后续脚本中自动调用schema apply。
当你需要的是“先看 SQL,再走评审和发布”,这套流程的关键就是把计算、审阅和执行拆开。Atlas 负责从两个状态生成计划,真正的数据库修改留给明确的 schema apply 或经过批准的迁移流程。
相关问题
schema diff 会自动执行 ALTER TABLE 吗?
不会。它输出的是从 from 到 to 的差异计划;需要实际应用时,应显式使用对应的 apply 或迁移执行流程。
为什么要提供 dev-url?
Atlas 需要开发数据库来解析目标 schema、确定数据库方言并计算迁移计划。它不等于要被变更的生产目标。
如何保存成迁移文件?
如果只是评审 SQL,可以用 shell 重定向保存 diff.sql;如果需要纳入 Atlas 版本化迁移目录,应研究 atlas migrate diff 的工作流,而不是把普通输出文件直接当作完整迁移目录。
Atlas migrate lint 怎么在部署前检查迁移是否可重放
- 上一篇
- Atlas migrate lint 怎么在部署前检查迁移是否可重放
- 下一篇
- grpcui 没有服务反射时怎么加载 proto 和 import 路径
-
- 文章 · 软件教程 | 20分钟前 | 数据库迁移 · Atlas migrate lint Atlas迁移检查 数据库迁移预检
- Atlas migrate lint 怎么在部署前检查迁移是否可重放
- 172浏览 收藏
-
- 文章 · 软件教程 | 22分钟前 | go · Go指针 sqlc sql.NullString 可空参数
- sqlc 可空查询参数怎么生成指针或 Null 类型
- 440浏览 收藏
-
- 文章 · 软件教程 | 27分钟前 |
- sqlc 怎么用命名参数生成可读的查询参数结构体
- 320浏览 收藏
-
- 文章 · 软件教程 | 33分钟前 | git · 故障排查 · 软件教程 · pre-commit Git提交 Lefthook Git hook core.hooksPath
- Lefthook 安装后 Git 提交没有触发怎么办
- 388浏览 收藏
-
- 文章 · 软件教程 | 35分钟前 |
- Gitleaks 怎么用 baseline 只报告新增泄露结果
- 498浏览 收藏
-
- 文章 · 软件教程 | 37分钟前 | 开发工具 · git · 代码检查 pre-commit glob Lefthook Git hooks staged files
- Lefthook 怎么只对暂存文件运行不同的检查命令
- 302浏览 收藏
-
- 文章 · 软件教程 | 41分钟前 |
- Pixi 怎么按 feature 建隔离环境并运行同一个项目任务
- 186浏览 收藏
-
- 文章 · 软件教程 | 43分钟前 |
- Pixi 怎么在 CI 中检查 pixi.lock 是否和项目配置同步
- 327浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 893次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 894次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 978次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 967次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 793次使用
-
- VS Code Markdown 预览怎样同步定位当前标题
- 2026-11-04 501浏览
-
- VS Code 怎么给 Go 项目配置测试任务:tasks.json 运行与结果验收
- 2026-07-09 501浏览
-
- Windows 11 如何开启 HEIF 图片支持
- 2026-05-31 501浏览
-
- TikTok用户画像与付费订阅变现方法
- 2026-05-27 501浏览
-
- 学信网学历翻译件申请方法
- 2026-05-27 501浏览

