在做数据分析或算法优化时,有一个需求是比较常见的:在调整了一些代码后,产生了新的结果数据,需要将这些数据以及产生它们的代码存储下来以便事后进行分析。解决这个问题的核心就在于如何对代码和结果数据进行版本管理,并且能够在复盘时快速拿到对应的版本。
代码的版本管理很简单,使用Git就可以。
如果需要存储的数据量不是很大,也可以用Git来将它们一并进行管理。若数据量比较大,使用Git就不太可取了,因为它在恢复指定版本的数据时可能会比较慢。
一种直观的方式是,在数据库中进行增量更新,并通过设置额外的标识列来区分产生数据的代码版本。我之前就是用的这种方式,它确实是可行的。不过在这里,我打算介绍另外一种方式:它就是号称数据界的Git、专为管理数据版本而生、具有版本控制功能的数据库——Dolt。
1、它是一个数据库
可以在多种操作系统下安装dolt,具体安装方法可以参考文档,这里不再赘述。下面介绍一下它在MacBook上的用法。
安装完成以后,就可以把dolt当成一个mysql数据库服务器一样来使用:
mkdir ~/dolt
cd ~/dolt # 我将在~/dolt目录下存放相关的数据
dolt sql-server # 启动数据库服务
# 当前终端会打印出类似下面的内容:
# Starting server with Config HP="localhost:3306"|T="28800000"|R="false"|L="info"|S="/tmp/mysql.sock"
这说明已经启动了一个mysql服务。保持此终端处于打开状态,用户可以用Navicat之类的工具连接到该数据库,并进行创建数据库、创建表、增删改查等操作。
当然,在执行
dolt sql-server
时,可以通过其他参数进行更加定制化的操作,如设置密码、端口等,具体可以通过dolt sql-server -h
进行查看。
2、对数据库进行版本管理
启动了mysql服务之后,假设我们创建了一个名为platform的数据库,此时可以看到在~/dolt
目录下多出了一个platform的目录,对应着刚创建的数据库。
进入platform目录后,可执行dolt status
来查看当前“数据库仓库”的状态。未进行任何操作时,应该会打印以下内容:
On branch main
nothing to commit, working tree clean
对于Git用户而言,这很熟悉。至此,完全可以将~/dolt/platform
当成一个Git仓库来进行操作了。几乎所有的Git命令,都有对应的dolt实现,且功能相同。
假如我在platform中创建了一张名为test
的表,再执行dolt status
,可以看到如下输出:
On branch main
Untracked files:
(use "dolt add <table>" to include in what will be committed)
new table: test
根据提示信息可以,当前“仓库”新增了一张表,如果对其进行版本管理,需要先通过dolt add
命令对其进行变更追踪,然后可以使用dolt commit
来提交变更。对于熟悉Git的用户,这一切都是非常熟悉的。
3、一些需要注意的点
- 在数据库服务处于启动状态下,在终端中执行
add
,commit
等命令时会失败,此时需要先停止数据库服务,再进行执行。一种替代方法是,在sql编辑器中调用内置的存储过程在执行对应操作:
CALL DOLT_ADD('test');
可以这里查看所有的存储过程及其用法。
- 在dolt中,若要使HEAD指针分离并指向某一次特定的提交以查看对应的内容时,必须为该次提交创建一个分支,然后使用分支切换的方法。因此,我们在更改数据时,对于需要复盘的数据提前建立分支,这样可以避免事后忘记哪次提交的数据是我们想要的。
当然,在提交时写好简明扼要的提交信息也是十分必要的。