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视频
Community Posts
No posts yet. Be the first to write about this video!
Write about this video