Dolt:让 SQL 用起来像 Git 一样

BBetter Stack
Computing/SoftwareSmall Business/StartupsInternet Technology

Transcript

00:00:00你的代码有 Git 管理,但你的数据呢?这正是问题所在,一个糟糕的 CSV 文件或一行配置数据
00:00:07一次电子表格的编辑就可能导致应用崩溃,而且没有清晰的差异对比,没有分支,没有合并请求
00:00:13也没有直观的回滚机制。这就是 Dolt,它是一个像 Git 一样工作的 SQL 数据库,你可以对表进行分支
00:00:20编辑行、对比变更、提交并合并它们,这是针对真实数据的真正版本控制。我将
00:00:26在接下来的几分钟里向你展示如何启动并运行它
00:00:35众所周知,大多数时候数据库在处理存储和 SQL 查询方面非常出色
00:00:41但它们不擅长我们日常的工作流程,比如分支、
00:00:47审核、差异对比、合并、回滚,以及准确查看谁更改了什么。因此我们通常会选择
00:00:54两种糟糕方案中的一种。第一种是将数据保存在真正的数据库中,你可以获得 SQL 索引、
00:01:00约束和结构,但当数据发生变更时,审核过程通常并不完善
00:01:07第二种方案是将数据放入 CSV、JSON 或 YAML 文件中,这样 Git 就能跟踪它。现在你有了
00:01:13提交和合并请求,但你失去了数据库擅长的功能:没有真正的 SQL,缺乏
00:01:20模式强制、差异对比和合并非常痛苦,而且当有人问是谁更改了这条记录时,答案
00:01:27基本就是拥有数据库访问权限的某个人,这算不上什么
00:01:32真正的工作流程。但现在想象一下:如果你可以运行分支命令 `dolt branch fix-this-data`
00:01:39还有 `dolt diff`、`dolt commit`、`dolt merge`,这些是我们已经熟悉的命令,但我们现在
00:01:46正将它们用于实际的数据库表。这就是 Dolt 的作用,它是针对数据库的版本控制
00:01:52如果你喜欢能加快工作流程的编码工具,请务必订阅,我们会有源源不断的视频更新
00:01:57废话不多说,我们有很多选择,有适用于 SQLite、Postgres 等的 Dolt。让我们快速
00:02:04演示一下。我将进入目录,然后从 GitHub 克隆 Dolt Hub 的入门仓库
00:02:10进入文件夹,首先克隆一个公共的 Dolt 数据库,然后运行 `dolt sql`。现在我们
00:02:18进入了 SQL 环境,我可以直接在终端运行 SQL 命令。好了,我要做一个小改动
00:02:27然后运行 `dolt diff`,这是第一个让你觉得“刚才发生了什么?”的时刻
00:02:34Dolt 不会告诉你某个文件变了,它会直接显示表结构的差异,哪一行发生了变化、哪一列
00:02:43发生了变化,旧值和新值是什么,我在这里都能看到。现在我们可以提交它,运行 `dolt add`
00:02:50然后运行 `dolt commit -m`,添加注释。我可以使用
00:02:56`checkout` 创建一个完整的分支,运行 `checkout -b [分支名]`。如果我在此基础上又做了一个改动,我可以
00:03:03再次使用 `dolt diff` 对比,再次提交。然后,如果我跳回
00:03:10主分支并合并,可以运行 `dolt merge`。所有这些我们已经知道的命令,我们现在
00:03:17是在 SQL 中进行操作。最后,你可以运行 `dolt log`,现在你的数据库有了提交历史,而不是备份、
00:03:24导出文件,或者某种电子表格编辑日志,这是一个真正的版本化数据库。这就是核心理念:
00:03:31针对数据表的 Git 工作流。现在让我们回顾一下,看看这一切究竟是如何运作的
00:03:37起初,Dolt 的操作感非常熟悉,它特意提供了像 `status`、`diff`、`add`、`commit`、`branch`、
00:03:44`checkout` 这样的命令。如果你懂 Git,你的大脑已经能理解这个工作流的形态了
00:03:48Dolt 的目标不是追踪文件,而是追踪关系型数据表。你可以通过
00:03:55命令行使用它,或者运行 `dolt sql-server`,这样你就可以通过
00:04:01兼容 MySQL 的客户端、ORM、BI 工具或应用程序代码来连接它。因此你的应用可以像对待普通 SQL 数据库一样对待 Dolt,但你
00:04:09却获得了针对数据的版本控制,这才是重点。你不需要在真正的
00:04:14数据库和 Git 工作流之间做选择,两者兼得。Dolt 使用了一种叫 “Prolly Tree” 的技术,简单来说
00:04:22普通的数据库使用树状结构来使读写
00:04:29变快,而 Dolt 使用的树状结构也擅长版本化。因此,它不需要在每次提交时
00:04:36复制整个数据库,Dolt 可以共享未变更的部分,并只追踪
00:04:42实际发生变化的部分。现在我们不仅可以询问“当前值是什么”,还可以真正询问
00:04:47“某件事发生前这行数据是什么样的”,这才是关键所在
00:04:52因为当出现问题时,我们不想靠猜,你想要检查历史记录。我现在可以
00:04:56查看差异,看到变更内容,如果需要还可以回滚。这就是针对
00:05:02结构化数据的版本控制。针对行和列的分支、提交、差异对比、合并和历史记录。那么 Dolt
00:05:10究竟适合在哪些流程中使用呢?因为这一切听起来很棒,但这地方可能会让你
00:05:15感到困惑。你可能听说过“数据 Git”,你可能会想,嘿,我们已经有
00:05:21处理这个的工具了。没错,确实有,但它们解决的是不同的问题。你可以把 CSV
00:05:28和 JSON 文件放进 Git,这在数据很小且简单时有效,但 Git 不理解你的模式,
00:05:35它不知道你的主键,也不会强制执行约束,它也不能在你的 CSV 上运行连接查询
00:05:41除非你添加更多工具。所以 Git 提供了版本控制,但它不是真的为数据库设计的
00:05:47还有 DVC,DVC 在机器学习工作流,尤其是处理大数据集和模型工件方面很棒,但
00:05:53它并不想成为你的实时关系型数据库。确实有 LakeFS,它将类 Git 概念引入了
00:06:00对象存储和数据湖中,这在湖仓规模下非常有用,但那是完全不同的层面,
00:06:07它和“分支 SQL 表、更改行、运行差异对比并合并回来”并不是一回事
00:06:13传统数据库也有历史记录工具,如临时表、审计日志、CDC,但其中大多数
00:06:20感觉不像是一个自然的工作流,它们没有给你那种清晰的“分支、更改、对比、合并、回滚”闭环
00:06:27我不会盲目地将 Dolt 放入每一个生产系统中,那不是重点。重点是,
00:06:33如果你的工作涉及随时间变化的结构化数据,且这些变更确实可能导致故障,
00:06:40我认为 Dolt 是值得一试的。当它第一次帮你规避掉一次糟糕的静默数据变更时,这个工作流
00:06:46就开始变得顺理成章了。我们有 Git,为什么不能有专门针对数据的工具?现在我们有了。如果你
00:06:52喜欢这类编程工具,请务必订阅 Better Stack 频道,我们下个视频再见
00:06:57视频

Key Takeaway

Dolt 是一个内置版本控制功能的 SQL 数据库,它通过 Prolly Tree 技术将 Git 的分支与合并工作流引入结构化数据管理,实现了数据库操作与版本审核的同步。

Highlights

  • Dolt 为 SQL 数据库提供类似 Git 的分支、差异对比、提交、合并及回滚功能。

  • SQL 数据库通常缺乏对数据变更的细粒度审核与版本控制,而 Dolt 通过 SQL 接口解决此问题。

  • Dolt 使用 Prolly Tree 技术实现版本控制,仅追踪变更的数据部分,而非每次提交都复制整个数据库。

  • 用户可通过 `dolt sql` 命令行或 `dolt sql-server` 模式使用,兼容 MySQL 客户端与应用代码。

  • 相比将数据存储于 CSV 或 JSON 文件中,Dolt 保留了 SQL 的模式强制、约束与连接查询功能。

  • Dolt 提供数据库级的提交历史记录,避免了传统的电子表格备份或审计日志管理方式。

Timeline

传统数据管理的局限

  • 现有的数据库缺乏清晰的变更差异对比、分支管理与回滚机制。
  • 将数据存储在 CSV 或 JSON 中虽可使用 Git,但会丢失 SQL 的索引、模式强制和连接查询能力。
  • 数据库层面的变更审计往往依赖不完善的权限管理,难以追踪谁更改了特定记录。

应用中的数据错误往往源于配置项或电子表格编辑的不当操作。由于缺乏原生版本控制,开发者通常在“功能完善的数据库”与“易于版本管理的扁平文件”之间被迫抉择,这两种方案均无法同时满足实时 SQL 查询与精细审计的需求。

Dolt 的核心功能与操作

  • Dolt 提供熟悉的 Git 命令行工具,如 `dolt branch`、`dolt diff`、`dolt commit` 和 `dolt merge`。
  • dolt diff 直接显示表结构的行、列变化及旧值与新值。
  • 数据库支持通过 `dolt sql-server` 以 MySQL 兼容方式连接至现有的 BI 工具或应用程序。

Dolt 通过将版本控制逻辑与 SQL 引擎集成,使用户能直接在数据表上执行提交和历史回溯。提交记录不再是零散的备份文件,而是集成在数据库内部的完整历史轨迹,极大提升了对结构化数据变更的掌控力。

技术实现与场景对比

  • Dolt 采用 Prolly Tree 数据结构,实现高效的差异追踪与版本共享。
  • DVC 专注于机器学习数据集,LakeFS 适用于对象存储和数据湖,两者均不能替代关系型数据库的实时事务控制。
  • 对于随时间频繁变更且对准确性要求极高的结构化数据,Dolt 可有效预防静默数据错误。

Prolly Tree 技术避免了全量数据备份带来的存储冗余,仅记录增量变更。虽然存在其他数据管理工具,但 Dolt 填补了关系型数据库内部版本化功能的空白,特别适用于需要频繁进行数据实验、审核与合并的开发场景。

Community Posts

No posts yet. Be the first to write about this video!

Write about this video