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 用戶端。
在執行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 有了一定的了解,請前往我們的文件。您還可以在我們的部落格中了解我們一直在做什麼。