信息时代数据才是最重要的,数据的表现形式也越来越丰富。 Git 已经占领了VCS的天下,在其他方面的用途也在不断的拓展,比如Git管理网站,Git写书,本文我们介绍一个在数据领域的项目GitDolt。GitDolt以关系数据库和Git的启发,把SQL语句和Git的分发协作有机地结合,集众长于一身的解决方案。
概述
GitDolt本质上是一个关系数据库,即它具有表、视图等,也可以对表执行SQL查询。在表单元级别支持Git控制语句。GitDolt是一个支持细粒度的按值版本控制的数据库,其数据和架构的所有更改都存储在提交日志中。
为了管理方便,对标GitHub之于Git,GitDolt也提供了远程托管平台网站DoltHub,用于托管Dolt数据库的基于云的存储解决方案,可简化数据库的协作管理。
Dolt提供了类似于Git的所有控制语句见上面帮助信息。
init:创建一个空的Dolt数据仓库。
status:显示工作树状态。
add:添加表更改到暂存更改列表。
reset:从暂存更改列表中删除表更改。
commit:记录对存储库的更改。
sql:对存储库中的表运行SQL查询。
sql-server:启动与MySQL兼容的服务器。
log:显示提交日志。
diff:区分表格。
blame:显示表的每一行的修订、修改者以及最后修改的内容。
merge:合并分支。
brance:创建,列出,编辑,删除分支。
checkout:检出分支或从HEAD覆盖表。
remote:管理一组跟踪的存储库。
push:同步远程仓。
pull:从远程的远程数据存储库中获取并合并。
fetch:从远程数据存储库更新数据库。
clone:从远程数据存储库克隆。
creds:管理账号凭据。
login:登录到Dolt远程主机。
version:显示当前的Dolt cli版本。
config:Dolt配置。
ls:列出工作集中的表。
schema:用于显示和导入表模式的命令。
table:用于复制,重命名,删除和导出表的命令。
conflicts:用于查看和解决合并冲突的命令。
安装
Dolt是Golang开发的项目,需要依赖Golang运行时,安装Dolt之前先确保安装了Golang环境。
一键安装
要在基于Linux或Mac的系统上安装,请运行:
sudo bash -c ‘curl -L | bash’
该命令会下载最新版本dolt发布包,并将其安装到/usr/local/bin/,为了可以直接使用需要将其添加的系统路径中,此处我们用ln给/bin添加一个软连接:
ln -s /usr/local/bin/dolt /bin/dolt
Windows版本安装,需要下载仓库下载软件发布的Microsoft Installer(.msi文件)并运行安装即可。
源码安装
clone dolt源码仓库然后一次运行
cd ~/dolt/go
go install ./cmd/dolt
go install ./cmd/git-dolt
go install ./cmd/git-dolt-smudge
上面命令将会安装必需组件到$GOROOT/bin路径,默认为路径为~/go下,应该可以看到类似信息:
ls -ltr $HOME/go/bin/
dolt git-dolt git-dolt-smudge
不管使用哪种方法,为了确认安装成功,在命令行下运行dolt会出帮助信息
dolt
Valid commands for dolt are
…
确保安装成功。
仿照Git管理,第一步先设置全局信息:姓名和电子邮件:
dolt config –global –add user.email chongchong@ijz.me
dolt config –global –add user.name “Chongchong”
初步使用
创建仓库
假设我们要在Dolt中创建一个数据库,显示各国新冠肺炎确诊数。
mkdir 2019-nCoV
cd 2019-nCoV
初始化目录,并加载一些数据:
dolt init
Successfully initialized dolt data repository.
创建表
dolt sql -q “create table COVID19( country varchar(14), population int,death int, primary key (country) )”
dolt sql -q “desc COVID19”
+————+————-+——+—–+———+——-+
| Field | Type | Null | Key | Default | Extra |
+————+————-+——+—–+———+——-+
| country | VARCHAR(14) | NO | PRI | | |
| population | INT | YES | | | |
| death | INT | YES | | | |
+————+————-+——+—–+———+——-+
现在给这个表插入一些数据:
insert into COVID19 (country, population,death) values
(” USA “, 398785,12893),
(“Spain”, 141942,14045),
(“Italy”,135586,17127),
(“France”,110070,10343),
(“Germany”,107663,2016),
(“China”,82751,3337),
(“Iran”,62589,3872),
(“United”,Kingdom 55949,6171)
查询刚才插入的数据:
dolt sql -q ‘select * from COVID19’
加上where条件
dolt sql -q ‘select * from COVID19 where country=”USA”‘
+———+————+——-+
| country | population | death |
+———+————+——-+
| USA | 398785 | 12893 |
+———+————+——-+
假设满意,请按以下方式创建提交:
dolt add .
dolt commit -m “Add new top10 countryinfo of COVID-19”
dolt status
On branch master
nothing to commit, working tree clean
Ok,这样仓库数据数据提交完成。
dolt也支持通过CSV和PSV文件导入数据:
dolt table import -pk=state COVID19 data.csv
更新数据
如果需要更新表,可以直接通过ipmort文件信息方式:
dolt table import –update-table <table> <csv_file>
或者通过SQL语句:
dolt sql –query ‘INSERT INTO COVID19 VALUES (“Country”, 1000,1)’
Rows inserted: 1
dolt sql –query ‘UPDATE COVID19 SET population=82750 where country =”China”‘
Rows updated: 1
更新后,查询状态就可以,看到有更改信息,显示类似于Git:
dolt status
On branch master
Changes not staged for commit:
(use “dolt add <table>” to update what will be committed)
(use “dolt checkout <table>” to discard changes in working directory)
modified: COVID19
dolt diff
如果信息更新Ok,则可以添加到版本历史
dolt add state_populations
dolt commit -m “Added ‘My State'”
分支工作流程
进行更改时,建议创建一个新分支,该分支将用作更改的工作空间。选择一个简短的分支名称,该名称描述计划要做的工作。同样,这与Git相同:
dolt checkout -b <branch>
进行更改后,像以前一样添加并提交修改后的表。工作完成后,就可以将所有更改恢复回master分支运行中了:
dolt checkout master
dolt merge <branch>
然后,需要添加并提交合并的数据:
dolt add .
dolt commit -m “Merge work from <branch> into master”
添加远程库
Dolt以与Git类似的方式支持远程仓。Dolt也提供在线平台DoltHub,这是Dolt数据库的托管服务。在下文中,我们以DoltHub为例来添加远程仓:
dolt login
通过浏览器窗口,打开DoltHub,创建账号,并创建HTTPS凭据。
创建成功后,会显示如下信息:
Key successfully associated with user: XXX
接下来,要确保在DoltHub创建了远程仓。例如,如果存储库是在名为”org”的组织下创建的,名称为”repo”,则可以这样添加远程库:
dolt remote add origin org/repo
添加后,使用以下命令查看具体信息:
dolt remote -v
应该显示如下内容:
origin doltremoteapi.dolthub/org/repo
如果已经在网络上创建了存储库并添加了一个远程服务器,则应该能够将分支”master”推送到名为” rigin”的远程服务器上,如下所示
dolt push origin master
一旦成功,其他人便可以克隆存储库(假设已授予他们权限)。
dolt clone org/repo
所有操作和Git操作Github也类似
有用的DoltHub数据集
DoltHub仓库提供了有用的数据库可供我们使用,比如:
新冠疫情数据库dolthub/repositories/Liquidata/corona-virus
word-net: dolthub/repositories/Liquidata/word-net
ImageNet:dolthub/repositories/Liquidata/image-net
Google Open Images:dolthub /repositories/Liquidata/open-images
国家/地区的IP地址:dolthub /repositories/Liquidata/ip-to-country
除了DoltHub dolt还支持其他形式的仓库存储形式,比如基于目录,aws和gcs的远程仓库:
文件:可以将目录用作远程目录,就像为其他远程目录一样,可以通过提供目录uri来clone,push和pull。dolt远程添加文件:
///Users/xyz/abs/path/
aws 可以直接使用aws云对象存储。
远程添加aws://dynamo-table:s3-bucket/ database
还可以使用GCS存储桶。创建一个gcs存储桶,使用gcloud auth login命令来设置的凭据。
远程添加gs://gcs-bucket/database