Dolt 是一个 SQL 数据库,您可以像 Git 存储库一样分叉、克隆、分支、合并、推送和拉取。
就像任何 MySQL 数据库一样连接到 Dolt 来读取或修改架构和数据。版本控制功能通过系统表、函数和过程在 SQL 中公开。
或者,使用类似 Git 的命令行界面导入 CSV 文件、提交更改、将其推送到远程或合并队友的更改。您所知道的所有 Git 命令对于 Dolt 来说都完全相同。
Git 版本文件。 Dolt 版本表。这就像 Git 和 MySQL 生了一个孩子。
我们还构建了 DoltHub,一个共享 Dolt 数据库的地方。我们免费托管公共数据。如果您想托管自己版本的 DoltHub,我们有 DoltLab。如果您希望我们为您运行 Dolt 服务器,我们有 Hosted Dolt。如果您正在寻找 Postgres 版本的 Dolt,我们构建了 DoltgreSQL。警告,现在是早期 Alpha 版本。 Dolt 已做好生产准备。
在 Discord 上加入我们,打个招呼并提出问题,或者查看我们的路线图,了解我们接下来要构建的内容。
很多东西! Dolt 是一个普遍有用的工具,有着无数的应用。但如果您想要一些想法,以下是人们迄今为止使用它的方式。
可以使用标准 MySQL binlog 复制将 Dolt 设置为现有 MySQL 或 MariaDB 数据库的副本。每次写入都会成为 Dolt 提交。这是获得 Dolt 版本控制优势并保留现有 MySQL 或 MariaDB 数据库的好方法。
dolt
CLI 具有与git
相同的命令,但有一些额外的功能。
$ dolt Valid commands for dolt are init - Create an empty Dolt data repository. status - Show the working tree status. add - Add table changes to the list of staged table changes. diff - Diff a table. reset - Remove table changes from the list of staged table changes. clean - Remove untracked tables from working set. commit - Record changes to the repository. sql - Run a SQL query against tables in repository. sql-server - Start a MySQL-compatible server. log - Show commit logs. branch - Create, list, edit, delete branches. checkout - Checkout a branch or overwrite a table from HEAD. merge - Merge a branch. conflicts - Commands for viewing and resolving merge conflicts. cherry-pick - Apply the changes introduced by an existing commit. revert - Undo the changes introduced in a commit. clone - Clone from a remote data repository. fetch - Update the database from a remote data repository. pull - Fetch from a dolt remote data repository and merge. push - Push to a dolt remote. config - Dolt configuration. remote - Manage set of tracked repositories. backup - Manage a set of server backups. login - Login to a dolt remote host. creds - Commands for managing credentials. ls - List tables in the working set. schema - Commands for showing and importing table schemas. table - Commands for copying, renaming, deleting, and exporting tables. tag - Create, list, delete tags. blame - Show what revision and author last modified each row of a table. constraints - Commands for handling constraints. migrate - Executes a database migration to use the latest Dolt data format. read-tables - Fetch table(s) at a specific commit into a new dolt repo gc - Cleans up unreferenced data from the repository. filter-branch - Edits the commit history using the provided query. merge-base - Find the common ancestor of two commits. version - Displays the current Dolt cli version. dump - Export all tables in the working set into a file.
Dolt 是一个约 103 兆字节的程序。
dolt $ du -h /Users/timsehn/go/bin/dolt 103M /用户/timsehn/go/bin/dolt
安装非常简单。下载它并将其放在您的PATH
中。我们有很多方法可以让大多数平台变得更容易。
要在基于 Linux 或 Mac 的系统上安装,请在终端中运行以下命令:
sudo bash -c 'curl -L https://github.com/dolthub/dolt/releases/latest/download/install.sh | bash'
这将下载最新的dolt
版本并将其放入/usr/local/bin/
中,这可能位于您的$PATH
上。
安装脚本需要 sudo 才能将dolt
放入/usr/local/bin
中。如果您没有 root 权限或不习惯使用它们运行脚本,您可以从最新版本下载适合您的平台的 dolt 二进制文件,解压缩它,然后将二进制文件放在$PATH
上的某个位置。
Dolt 打包在 Arch Linux 的官方存储库中。
pacman -S dolt
Dolt 使用 Homebrew,每个版本都会更新。
brew install dolt
在 macOS 上,Dolt 还可以通过 MacPorts 通过社区管理的端口进行安装:
sudo 端口安装 dolt
下载最新版本的 Microsoft 安装程序( .msi
文件)并运行它。
有关在 Windows 上运行的信息,请参阅此处。
您可以使用 Chocolatey 安装dolt
:
choco 安装 dolt
Dolt 有以下官方 Docker 镜像:
dolthub/dolt
用于将 Dolt 作为 CLI 工具运行。
dolthub/dolt-sql-server
用于在服务器模式下运行 Dolt。
确保你已经安装了 Go,并且go
在你的路径中。 Dolt 依赖于 cgo,因此您还需要一个可用的 C 编译器和工具链。
克隆此存储库并 cd 到go
目录中。然后运行:
go install ./cmd/dolt
输出将位于$GOPATH/bin
中,默认为~/go/bin
。要测试您的构建,请尝试:
~/go/bin/dolt version
通过在终端中运行dolt
来验证安装是否成功。
$ dolt Valid commands for dolt are [...]
使用您的用户名和电子邮件配置dolt
,您需要使用这些用户名和电子邮件来创建提交。这些命令的工作方式与 git 完全相同。
$ dolt config --global --add user.email [email protected] $ dolt config --global --add user.name "YOUR NAME"
Dolt 需要一个地方来存储您的数据库。我将把我的数据库放在~/dolt
中。
% cd ~% mkdir 多尔特 % CD 时间
您创建的任何数据库都将存储在该目录中。因此,对于本示例,一旦运行create database getting_started
就会在此处创建一个名为getting_started
的目录。导航到~/dolt/getting_started
将允许您使用 Dolt 命令行访问此数据库。
注意:对于本示例,运行create database getting_started;
后将创建getting_started
目录;在创建架构部分的 SQL shell 中。除了创建目录并导航到该目录之外,不要执行任何操作。
Dolt 附带内置的 MySQL 兼容数据库服务器。要启动它,请使用命令dolt sql-server
。运行此命令将在端口 3306 上启动服务器。
dolt sql 服务器 使用配置 HP="localhost:3306"|T="28800000"|R="false"|L="info" 启动服务器
您的终端将挂在那里。这意味着服务器正在运行。任何错误都会在此终端中打印。只需将其留在那里并打开一个新终端即可。
在新终端中,我们现在将使用客户端连接到正在运行的数据库服务器。 Dolt 还附带 MySQL 兼容客户端。
% dolt -u root -p "" sql# 欢迎使用 Dolt MySQL 客户端。# 语句必须以 ';' 终止。# “exit”或“quit”(或 Ctrl-D)退出。mysql>
在运行dolt sql-server
另一个终端中,您将看到以下日志行。
2022-06-06T13:14:32-07:00 INFO [conn 1] NewConnection {DisableClientMultiStatements=false}
您已连接!
当我们在这里时,让我们获取 MySQL 的副本,以便我们可以与该客户端连接。前往 MySQL 入门文档并在您的计算机上安装 MySQL。我使用 Homebrew 在我的 Mac 上安装 MySQL。
MySQL 附带一个名为mysqld
的 MySQL 服务器和一个名为mysql
的 MySQL 客户端。你只对客户感兴趣。按照 MySQL 文档中的说明进行操作后,请确保您的路径上有mysql
客户端的副本:
% mysql --版本 mysql Ver 8.0.29 for macos12.2 on x86_64 (Homebrew)
现在,要将mysql
客户端连接到 Dolt,您将通过传入主机和端口来强制 MySQL 客户端通过 TCP 接口。默认是 Dolt 支持的套接字接口,但仅在localhost
上可用。所以,最好展示一下 TCP 接口。 MySQL 客户端还要求您指定一个用户,在本例中root
。
% mysql --主机 127.0.0.1 --端口 3306 -uroot 欢迎使用 MySQL 监视器。 命令以 ; 结尾或g。 你的 MySQL 连接 ID 是 2 服务器版本:5.7.9-Vitess 版权所有 (c) 2000、2022,Oracle 和/或其附属公司。 Oracle 是 Oracle Corporation 和/或其公司的注册商标 附属机构。其他名称可能是其各自的商标 业主。 输入“帮助”;或“h”寻求帮助。键入“c”以清除当前输入语句。 mysql>
同样,为了确保客户端实际连接,您应该在dolt sql-server
终端中看到以下内容
2022-06-06T13:26:55-07:00 INFO [conn 2] NewConnection {DisableClientMultiStatements=false}
正如您所看到的,Dolt 支持任何与 MySQL 兼容的客户端。 Dolt 附带了一个客户端,但您可以使用任何 MySQL 客户端,例如 MySQL 附带的客户端。
现在我们实际上已经准备好做一些有趣的事情了。我将留在mysql
客户端并执行以下 SQL 语句来创建一个名为getting_started
的数据库。 getting_started
数据库将包含三个表: employees
、 teams
和employees_teams
。
mysql> create database getting_started; Query OK, 1 row affected (0.04 sec) mysql> use getting_started; Database changed mysql> create table employees ( id int, last_name varchar(255), first_name varchar(255), primary key(id)); Query OK, 0 rows affected (0.01 sec) mysql> create table teams ( id int, team_name varchar(255), primary key(id)); Query OK, 0 rows affected (0.00 sec) mysql> create table employees_teams( team_id int, employee_id int, primary key(team_id, employee_id), foreign key (team_id) references teams(id), foreign key (employee_id) references employees(id)); Query OK, 0 rows affected (0.01 sec) mysql> show tables; +---------------------------+ | Tables_in_getting_started | +---------------------------+ | employees | | employees_teams | | teams | +---------------------------+ 3 rows in set (0.00 sec)
Dolt 支持外键、二级索引、触发器、检查约束和存储过程。它是一个现代的、功能丰富的 SQL 数据库。
是时候使用您的第一个 Dolt 功能了。我们将做出 Dolt 承诺。 Dolt 提交可以让你进行时间旅行并查看血统。每当您想要恢复或与该时间点进行比较时,请进行 Dolt 提交。
Dolt 通过 Git 风格的界面公开版本控制功能。在命令行上,Dolt 命令完全映射到其等效的 Git,目标是表而不是文件。在 SQL 中,Dolt 将版本控制读取操作公开为系统表,将版本控制写入操作公开为存储过程。
系统表和存储过程的命名遵循dolt_
模式。因此 CLI 上的dolt add
就变成了dolt_add
作为存储过程。传递选项也遵循命令行模型。例如,要指定要添加的表,请将表名称作为选项发送到dolt_add
过程。对于命名参数(例如将消息发送到dolt_commit
命令),请按顺序使用两个参数,例如('-m', 'This is a message')
。如果您了解 Git,那么版本控制程序和系统表应该很熟悉。
因此,我们像这样添加并提交新模式。
mysql> call dolt_add('teams', 'employees', 'employees_teams'); +--------+ | status | +--------+ | 0 | +--------+ 1 row in set (0.03 sec) mysql> call dolt_commit('-m', 'Created initial schema'); +----------------------------------+ | hash | +----------------------------------+ | ne182jemgrlm8jnjmoubfqsstlfi1s98 | +----------------------------------+ 1 row in set (0.02 sec) mysql> select * from dolt_log; +----------------------------------+-----------+-----------------+-------------------------+----------------------------+ | commit_hash | committer | email | date | message | +----------------------------------+-----------+-----------------+-------------------------+----------------------------+ | ne182jemgrlm8jnjmoubfqsstlfi1s98 | Tim Sehn | [email protected] | 2022-06-07 16:35:49.277 | Created initial schema | | vluuhvd0bn59598utedt77ed9q5okbcb | Tim Sehn | [email protected] | 2022-06-07 16:33:59.531 | Initialize data repository | +----------------------------------+-----------+-----------------+-------------------------+----------------------------+ 2 rows in set (0.01 sec)
就这样,你就有了。您的模式已创建,并且您有一个 Dolt 提交来跟踪创建过程,如dolt_log
系统表中所示。
请注意,Dolt 提交与标准 SQL 事务COMMIT
不同。在本例中,我在启用AUTOCOMMIT
的情况下运行数据库,因此每个 SQL 语句都会自动生成一个事务COMMIT
。如果您希望系统为每个事务生成 Dolt 提交,请使用系统变量@@dolt_transaction_commit
。
现在,我将用 DoltHub 的一些员工填充数据库。然后,我将把员工分配到两个团队:工程和销售。首席执行官在初创公司身兼数职,因此他会被分配到多个团队。
mysql> insert into employees values (0, 'Sehn', 'Tim'), (1, 'Hendriks', 'Brian'), (2, 'Son','Aaron'), (3, 'Fitzgerald', 'Brian'); Query OK, 4 rows affected (0.01 sec) mysql> select * from employees where first_name='Brian'; +------+------------+------------+ | id | last_name | first_name | +------+------------+------------+ | 1 | Hendriks | Brian | | 3 | Fitzgerald | Brian | +------+------------+------------+ 2 rows in set (0.00 sec) mysql> insert into teams values (0, 'Engineering'), (1, 'Sales'); Query OK, 2 rows affected (0.00 sec) mysql> insert into employees_teams values (0,0), (1,0), (2,0), (0,1), (3,1); ERROR 1452 (HY000): cannot add or update a child row - Foreign key violation on fk: `rv9ek7ft`, table: `employees_teams`, referenced table: `teams`, key: `[2]`
糟糕,我违反了限制。看起来我在员工之前创建了团队表。插入时应始终指定列,而不是依赖自然顺序。为我服务是对的! Dolt 具有现代 SQL 关系数据库的全部功能,可确保数据完整性。
mysql> insert into employees_teams(employee_id, team_id) values (0,0), (1,0), (2,0), (0,1), (3,1); Query OK, 5 rows affected (0.01 sec) mysql> select first_name, last_name, team_name from employees join employees_teams on (employees.id=employees_teams.employee_id) join teams on (teams.id=employees_teams.team_id) where team_name='Engineering'; +------------+-----------+-------------+ | first_name | last_name | team_name | +------------+-----------+-------------+ | Tim | Sehn | Engineering | | Brian | Hendriks | Engineering | | Aaron | Son | Engineering | +------------+-----------+-------------+ 3 rows in set (0.00 sec)
看起来一切都已插入并且正确。我能够使用这三个表JOIN
列出工程团队的成员。 Dolt 支持最多 12 个表JOIN
。同样,Dolt 是一个现代 SQL 关系数据库,与 Git 风格的版本控制相结合。
现在,如果您想在提交之前查看工作集中发生了什么变化,该怎么办?您使用dolt_status
和dolt_diff_
系统表。
mysql> select * from dolt_status; +-----------------+--------+----------+ | table_name | staged | status | +-----------------+--------+----------+ | teams | 0 | modified | | employees | 0 | modified | | employees_teams | 0 | modified | +-----------------+--------+----------+ 3 rows in set (0.01 sec) mysql> select * from dolt_diff_employees; +--------------+---------------+-------+-----------+----------------+----------------+-----------------+---------+----------------------------------+-------------------------+-----------+ | to_last_name | to_first_name | to_id | to_commit | to_commit_date | from_last_name | from_first_name | from_id | from_commit | from_commit_date | diff_type | +--------------+---------------+-------+-----------+----------------+----------------+-----------------+---------+----------------------------------+-------------------------+-----------+ | Sehn | Tim | 0 | WORKING | NULL | NULL | NULL | NULL | ne182jemgrlm8jnjmoubfqsstlfi1s98 | 2022-06-07 16:35:49.277 | added | | Hendriks | Brian | 1 | WORKING | NULL | NULL | NULL | NULL | ne182jemgrlm8jnjmoubfqsstlfi1s98 | 2022-06-07 16:35:49.277 | added | | Son | Aaron | 2 | WORKING | NULL | NULL | NULL | NULL | ne182jemgrlm8jnjmoubfqsstlfi1s98 | 2022-06-07 16:35:49.277 | added | | Fitzgerald | Brian | 3 | WORKING | NULL | NULL | NULL | NULL | ne182jemgrlm8jnjmoubfqsstlfi1s98 | 2022-06-07 16:35:49.277 | added | +--------------+---------------+-------+-----------+----------------+----------------+-----------------+---------+----------------------------------+-------------------------+-----------+ 4 rows in set (0.00 sec)
正如您从差异中看到的,我已将正确的值添加到employees
表中。这些值以前为NULL
,现在已填充。
让我们以另一个 Dolt 提交结束,这次使用-am
添加所有受影响的表。
mysql> call dolt_commit('-am', 'Populated tables with data'); +----------------------------------+ | hash | +----------------------------------+ | 13qfqa5rojq18j84d1n2htjkm6fletg4 | +----------------------------------+ 1 row in set (0.02 sec)
您可以使用dolt_log
检查日志,并使用无范围dolt_diff
查看每次提交中更改了哪些表。无范围dolt_diff
告诉您在表的特定提交中架构、数据或两者是否发生更改。
mysql> select * from dolt_log; +----------------------------------+-----------+-----------------+-------------------------+----------------------------+ | commit_hash | committer | email | date | message | +----------------------------------+-----------+-----------------+-------------------------+----------------------------+ | 13qfqa5rojq18j84d1n2htjkm6fletg4 | Tim Sehn | [email protected] | 2022-06-07 16:39:32.066 | Populated tables with data | | ne182jemgrlm8jnjmoubfqsstlfi1s98 | Tim Sehn | [email protected] | 2022-06-07 16:35:49.277 | Created initial schema | | vluuhvd0bn59598utedt77ed9q5okbcb | Tim Sehn | [email protected] | 2022-06-07 16:33:59.531 | Initialize data repository | +----------------------------------+-----------+-----------------+-------------------------+----------------------------+ 3 rows in set (0.00 sec) mysql> select * from dolt_diff; +----------------------------------+-----------------+-----------+-----------------+-------------------------+----------------------------+-------------+---------------+ | commit_hash | table_name | committer | email | date | message | data_change | schema_change | +----------------------------------+-----------------+-----------+-----------------+-------------------------+----------------------------+-------------+---------------+ | 13qfqa5rojq18j84d1n2htjkm6fletg4 | teams | Tim Sehn | [email protected] | 2022-06-07 16:39:32.066 | Populated tables with data | 1 | 0 | | 13qfqa5rojq18j84d1n2htjkm6fletg4 | employees | Tim Sehn | [email protected] | 2022-06-07 16:39:32.066 | Populated tables with data | 1 | 0 | | 13qfqa5rojq18j84d1n2htjkm6fletg4 | employees_teams | Tim Sehn | [email protected] | 2022-06-07 16:39:32.066 | Populated tables with data | 1 | 0 | | ne182jemgrlm8jnjmoubfqsstlfi1s98 | employees | Tim Sehn | [email protected] | 2022-06-07 16:35:49.277 | Created initial schema | 0 | 1 | | ne182jemgrlm8jnjmoubfqsstlfi1s98 | employees_teams | Tim Sehn | [email protected] | 2022-06-07 16:35:49.277 | Created initial schema | 0 | 1 | | ne182jemgrlm8jnjmoubfqsstlfi1s98 | teams | Tim Sehn | [email protected] | 2022-06-07 16:35:49.277 | Created initial schema | 0 | 1 | +----------------------------------+-----------------+-----------+-----------------+-------------------------+----------------------------+-------------+---------------+ 6 rows in set (0.00 sec)
Dolt 支持通过call dolt_reset()
撤消更改。假设我不小心掉了一张桌子。
mysql> drop table employees_teams; Query OK, 0 rows affected (0.01 sec) mysql> show tables; +---------------------------+ | Tables_in_getting_started | +---------------------------+ | employees | | teams | +---------------------------+ 2 rows in set (0.00 sec)
在传统数据库中,这可能是灾难性的。在多尔特,你只差一个命令就可以拿回你的桌子。
mysql> call dolt_reset('--hard'); +--------+ | status | +--------+ | 0 | +--------+ 1 row in set (0.01 sec) mysql> show tables; +---------------------------+ | Tables_in_getting_started | +---------------------------+ | employees | | employees_teams | | teams | +---------------------------+ 3 rows in set (0.01 sec)
Dolt 使操作数据库不易出错。您可以随时撤销正在进行的更改或退回到已知的良好状态。您还可以使用dolt_revert()
撤消特定提交。即使您不小心在错误的数据库上运行了drop database
,Dolt 也可以通过调用dolt_undrop()
存储过程来撤消该操作。
讨厌命令行?让我们使用Tableplus做一些修改。 Tableplus 是一个免费的 SQL 工作台。按照其网站上的安装说明进行操作。
现在,要连接,您必须选择 MySQL 作为连接类型。然后输入连接名称, getting_started
作为您的数据库, root
作为您的用户。
单击连接,您将看到熟悉的数据库工作台 GUI。
为了在分支上进行更改,我使用dolt_checkout()
存储过程。使用-b
选项创建一个分支,就像在 Git 中一样。
Tableplus 使我能够在 SQL 选项卡上输入多行 SQL 脚本。我输入以下 SQL 来签出分支、更新、插入、删除,最后提交我的更改。
调用 dolt_checkout('-b','modifications');更新员工 SET first_name='Timothy' where first_name='Tim';插入 INTO 员工 (id,first_name,last_name) 值 (4,'Daylon', 'Wilkins') ;插入employees_teams(team_id,employee_id)值(0,4);从employees_teams中删除,其中employee_id=0并且team_id=1; call dolt_commit('-am', '分支上的修改');
这是 Tableplus 中的结果。
回到我的终端,我看不到 Tableplus 中所做的表修改,因为它们发生在与我在会话中签出的分支不同的分支上。
mysql> select * from dolt_branches; +---------------+----------------------------------+------------------+------------------------+-------------------------+----------------------------+ | name | hash | latest_committer | latest_committer_email | latest_commit_date | latest_commit_message | +---------------+----------------------------------+------------------+------------------------+-------------------------+----------------------------+ | main | 13qfqa5rojq18j84d1n2htjkm6fletg4 | Tim Sehn | [email protected] | 2022-06-07 16:39:32.066 | Populated tables with data | | modifications | uhkv57j4bp2v16vcnmev9lshgkqq8ppb | Tim Sehn | [email protected] | 2022-06-07 16:41:49.847 | Modifications on a branch | +---------------+----------------------------------+------------------+------------------------+-------------------------+----------------------------+ 2 rows in set (0.00 sec) mysql> select active_branch(); +-----------------+ | active_branch() | +-----------------+ | main | +-----------------+ 1 row in set (0.00 sec) mysql> select * from employees; +------+------------+------------+ | id | last_name | first_name | +------+------------+------------+ | 0 | Sehn | Tim | | 1 | Hendriks | Brian | | 2 | Son | Aaron | | 3 | Fitzgerald | Brian | +------+------------+------------+ 4 rows in set (0.00 sec)
无论我使用 SQL as of
语法签出什么,我都可以查询分支。
mysql> select * from employees as of 'modifications'; +------+------------+------------+ | id | last_name | first_name | +------+------------+------------+ | 0 | Sehn | Timothy | | 1 | Hendriks | Brian | | 2 | Son | Aaron | | 3 | Fitzgerald | Brian | | 4 | Wilkins | Daylon | +------+------------+------------+ 5 rows in set (0.01 sec)
如果我想查看两个分支之间的差异,我可以使用dolt_diff()
表函数。它需要两个分支和表名作为参数。
mysql> select * from dolt_diff('main', 'modifications', 'employees'); +--------------+---------------+-------+---------------+-------------------------+----------------+-----------------+---------+-------------+-------------------------+-----------+ | to_last_name | to_first_name | to_id | to_commit | to_commit_date | from_last_name | from_first_name | from_id | from_commit | from_commit_date | diff_type | +--------------+---------------+-------+---------------+-------------------------+----------------+-----------------+---------+-------------+-------------------------+-----------+ | Sehn | Timothy | 0 | modifications | 2022-06-07 16:41:49.847 | Sehn | Tim | 0 | main | 2022-06-07 16:39:32.066 | modified | | Wilkins | Daylon | 4 | modifications | 2022-06-07 16:41:49.847 | NULL | NULL | NULL | main | 2022-06-07 16:39:32.066 | added | +--------------+---------------+-------+---------------+-------------------------+----------------+-----------------+---------+-------------+-------------------------+-----------+ 2 rows in set (0.00 sec)
正如您所看到的,您可以使用 Dolt 在 SQL 数据库中充分发挥 Git 风格的分支和差异功能。
我还可以在分支上进行架构更改,以便对新架构进行隔离测试。我将在新分支上添加start_date
列并填充它。
mysql> call dolt_checkout('-b', 'schema_changes'); +--------+ | status | +--------+ | 0 | +--------+ 1 row in set (0.01 sec) mysql> alter table employees add column start_date date; Query OK, 0 rows affected (0.02 sec) mysql> update employees set start_date='2018-09-08'; Query OK, 4 rows affected (0.01 sec) Rows matched: 4 Changed: 4 Warnings: 0 mysql> update employees set start_date='2021-04-19' where last_name='Fitzgerald'; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from employees; +------+------------+------------+------------+ | id | last_name | first_name | start_date | +------+------------+------------+------------+ | 0 | Sehn | Tim | 2018-09-08 | | 1 | Hendriks | Brian | 2018-09-08 | | 2 | Son | Aaron | 2018-09-08 | | 3 | Fitzgerald | Brian | 2021-04-19 | +------+------------+------------+------------+ 4 rows in set (0.00 sec) mysql> call dolt_commit('-am', 'Added start_date column to employees'); +----------------------------------+ | hash | +----------------------------------+ | pg3nfi0j1dpc5pf1rfgckpmlteaufdrt | +----------------------------------+ 1 row in set (0.01 sec)
更改分支上的架构为您提供了一种对新架构更改进行隔离集成测试的新方法。
我们假设schema_changes
分支上的新模式和modifications
分支上的数据的所有测试都完美完成。是时候将我们所有的编辑合并到main
中了。这是使用dolt_merge
存储过程完成的。
mysql> call dolt_checkout('main'); +--------+ | status | +--------+ | 0 | +--------+ 1 row in set (0.01 sec) mysql> select * from dolt_status; Empty set (0.00 sec) mysql> call dolt_merge('schema_changes'); +--------------+ | no_conflicts | +--------------+ | 1 | +--------------+ 1 row in set (0.01 sec) mysql> select * from employees; +------+------------+------------+------------+ | id | last_name | first_name | start_date | +------+------------+------------+------------+ | 0 | Sehn | Tim | 2018-09-08 | | 1 | Hendriks | Brian | 2018-09-08 | | 2 | Son | Aaron | 2018-09-08 | | 3 | Fitzgerald | Brian | 2021-04-19 | +------+------------+------------+------------+ 4 rows in set (0.00 sec)
架构更改成功。我们现在已经确定了开始日期。接下来是数据更改。
mysql> call dolt_merge('modifications'); +--------------+ | no_conflicts | +--------------+ | 1 | +--------------+ 1 row in set (0.02 sec) mysql> select * from employees; +------+------------+------------+------------+ | id | last_name | first_name | start_date | +------+------------+------------+------------+ | 0 | Sehn | Timothy | 2018-09-08 | | 1 | Hendriks | Brian | 2018-09-08 | | 2 | Son | Aaron | 2018-09-08 | | 3 | Fitzgerald | Brian | 2021-04-19 | | 4 | Wilkins | Daylon | NULL | +------+------------+------------+------------+ 5 rows in set (0.00 sec)
数据更改也成功。正如您所看到的,我现在是“Timothy”而不是“Tim”,添加了 Daylon,并且除了在不同分支上添加的 Daylon 之外,我们都有开始日期。
mysql> select first_name, last_name, team_name from employees join employees_teams on (employees.id=employees_teams.employee_id) join teams on (teams.id=employees_teams.team_id) where team_name='Sales'; +------------+------------+-----------+ | first_name | last_name | team_name | +------------+------------+-----------+ | Brian | Fitzgerald | Sales | +------------+------------+-----------+ 1 row in set (0.01 sec)
我也离开了销售团队。工程就是生命。
我必须提交所有更改,因为最后一次合并不是快进合并。
mysql> call dolt_commit('-m', 'Merged all branches'); +----------------------------------+ | hash | +----------------------------------+ | vn9b0qcematsj2f6ka0hfoflhr5s6p0b | +----------------------------------+ 1 row in set (0.01 sec) mysql> select * from dolt_log; +----------------------------------+-----------+-----------------+-------------------------+--------------------------------------+ | commit_hash | committer | email | date | message | +----------------------------------+-----------+-----------------+-------------------------+--------------------------------------+ | vn9b0qcematsj2f6ka0hfoflhr5s6p0b | Tim Sehn | [email protected] | 2022-06-07 17:10:02.07 | Merged all branches | | pg3nfi0j1dpc5pf1rfgckpmlteaufdrt | Tim Sehn | [email protected] | 2022-06-07 16:44:37.513 | Added start_date column to employees | | uhkv57j4bp2v16vcnmev9lshgkqq8ppb | Tim Sehn | [email protected] | 2022-06-07 16:41:49.847 | Modifications on a branch | | 13qfqa5rojq18j84d1n2htjkm6fletg4 | Tim Sehn | [email protected] | 2022-06-07 16:39:32.066 | Populated tables with data | | ne182jemgrlm8jnjmoubfqsstlfi1s98 | Tim Sehn | [email protected] | 2022-06-07 16:35:49.277 | Created initial schema | | vluuhvd0bn59598utedt77ed9q5okbcb | Tim Sehn | [email protected] | 2022-06-07 16:33:59.531 | Initialize data repository | +----------------------------------+-----------+-----------------+-------------------------+--------------------------------------+ 6 rows in set (0.00 sec)
现在,我们有了一个数据库,其中所有架构和数据更改都已合并并可供使用。
哪个提交更改了我的名字?使用 Dolt,您可以拥有数据库中每个细胞的谱系。让我们使用dolt_history_
和dolt_diff_
来探索 Dolt 中的沿袭功能。
dolt_history_
显示每次提交时行的状态。
mysql> select * from dolt_history_employees where id=0 order by commit_date; +------+-----------+------------+------------+----------------------------------+-----------+-------------------------+ | id | last_name | first_name | start_date | commit_hash | committer | commit_date | +------+-----------+------------+------------+----------------------------------+-----------+-------------------------+ | 0 | Sehn | Tim | NULL | 13qfqa5rojq18j84d1n2htjkm6fletg4 | Tim Sehn | 2022-06-07 16:39:32.066 | | 0 | Sehn | Timothy | NULL | uhkv57j4bp2v16vcnmev9lshgkqq8ppb | Tim Sehn | 2022-06-07 16:41:49.847 | | 0 | Sehn | Tim | 2018-09-08 | pg3nfi0j1dpc5pf1rfgckpmlteaufdrt | Tim Sehn | 2022-06-07 16:44:37.513 | | 0 | Sehn | Timothy | 2018-09-08 | vn9b0qcematsj2f6ka0hfoflhr5s6p0b | Tim Sehn | 2022-06-07 17:10:02.07 | +------+-----------+------------+------------+----------------------------------+-----------+-------------------------+ 4 rows in set (0.00 sec)
dolt_diff_
允许您过滤历史记录,仅在相关单元格更改时提交。在本例中,我对更改我的名字的提交感兴趣。请注意,有两个提交更改了我的名字,因为一个是原始更改,第二个是合并提交。
mysql> select to_commit,from_first_name,to_first_name from dolt_diff_employees where (from_id=0 or to_id=0) and (from_first_name <> to_first_name or from_first_name is NULL) order by to_commit_date; +----------------------------------+-----------------+---------------+ | to_commit | from_first_name | to_first_name | +----------------------------------+-----------------+---------------+ | 13qfqa5rojq18j84d1n2htjkm6fletg4 | NULL | Tim | | uhkv57j4bp2v16vcnmev9lshgkqq8ppb | Tim | Timothy | | vn9b0qcematsj2f6ka0hfoflhr5s6p0b | Tim | Timothy | +----------------------------------+-----------------+---------------+ 3 rows in set (0.01 sec)
Dolt 提供强大的数据审计功能,具体到单个单元。数据库中的每个单元格何时、如何以及为何随时间发生变化?
现在您已经对 Dolt 有了一定的了解,请前往我们的文档。您还可以在我们的博客中了解我们一直在做什么。