dolt - Dolt – Git for Data

(Dolt – Git for Data)

Created at: 2019-07-25 01:46:25
Language: Go
License: Apache-2.0

ドルトはデータのためのGitです!

Doltは、フォーク、クローン、ブランチ、マージ、プッシュできるSQLデータベースです。 Gitリポジトリのようにプルします。他のと同じようにドルトに接続 SQLを使用してクエリを実行したり、データを更新したりするためのMySQLデータベース コマンド。コマンドラインインターフェイスを使用してCSVファイルをインポートし、コミットします 変更をリモートにプッシュするか、チームメイトの変更をマージします。

Git で知っているすべてのコマンドは、Dolt でもまったく同じように機能します。ギット バージョンファイル、Doltバージョンテーブル。それはGitとMySQLが持っていたようなものです 赤ちゃん。

また、共有する場所であるドルトハブも構築しました ドルトデータベース。公開データは無料でホストされています。ホストする場合 あなた自身のバージョンのDoltHub、私たちはDoltLabを持っています。あなたが私たちにあなたのためにドルトサーバーを実行したい場合は、私たちはホストされたDoltを持っています。

Discordに参加して挨拶し、 質問をするか、ロードマップをチェックして、次に何を構築するかを確認してください。

それは何のためですか?

たくさんのこと!ドルトは無数の一般的に便利なツールです アプリケーション。しかし、あなたがいくつかのアイデアが必要な場合は、ここに人々がどのように使用しているかがあります これまでのところ

ドルト・クリ

CLI には、 と同じコマンドがありますが、いくつかの追加機能があります。

dolt
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.
          sql-client - Starts a built-in MySQL client.
                 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 は 1 ~68 メガバイトのプログラムです。

dolt $ du -h /Users/timsehn//go/bin/dolt
 68M	/Users/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

インストールスクリプトは、 .ルートがない場合 特権またはそれらを使用してスクリプトを実行することに慣れていない場合は、DOLTバイナリをダウンロードできます 最新リリースのプラットフォームの場合は、解凍します。 バイナリをあなたのどこかに置きます。

dolt
/usr/local/bin
$PATH

マック

自作

ドルトは自作にあり、リリースごとに更新されます。

brew install dolt

マックポート

macOSでは、MacPortsを介してコミュニティ管理ポートを介してDoltをインストールすることもできます。

sudo port install dolt

ウィンドウズ

最新のマイクロソフトインストーラ(ファイル)をリリースでダウンロードして実行します それ。

.msi

Windows での実行については、こちらを参照してください。

チョコレート

あなたはチョコレートを使ってインストールすることができます:

dolt

choco install dolt

ソースから

Goがインストールされていること、およびそれがパスにあることを確認してください。

go

このリポジトリと cd をディレクトリに複製します。次に、以下を実行します。

go

go install ./cmd/dolt

構成

で実行して、インストールが成功したことを確認します ターミナル。

dolt

$ dolt
Valid commands for dolt are
[...]

ユーザー名とメールアドレスで構成します。 コミットを作成します。コマンドはgitとまったく同じように機能します。

dolt

$ dolt config --global --add user.email YOU@DOMAIN.COM
$ dolt config --global --add user.name "YOUR NAME"

はじめ

データを保存するディレクトリに移動します

Dolt にはデータベースを保存する場所が必要です。私は自分のデータベースを.

~/dolt

% cd ~
% mkdir dolt
% cd dolt

作成したデータベースはすべて、このディレクトリに格納されます。したがって、この例では、実行すると、という名前のディレクトリがここに作成されます。に移動すると、Dolt コマンド ラインを使用してこのデータベースにアクセスできます。

getting_started
create database getting_started
~/dolt/getting_started

MySQL 互換データベースサーバーの起動

Dolt には MySQL 互換のデータベースサーバーが組み込まれています。開始するには、コマンドを使用します。このコマンドを実行すると、サーバはポート 3306 で起動します。

dolt sql-server

dolt sql-server
Starting server with Config HP="localhost:3306"|T="28800000"|R="false"|L="info"

あなたの端末はただそこにぶら下がっています。これは、サーバーが実行中であることを意味します。エラーはすべてこの端末に出力されます。そのままにして、新しいターミナルを開いてください。

任意の MySQL クライアントと接続する

新しいターミナルでは、クライアントを使用して実行中のデータベースサーバーに接続します。Dolt には MySQL 互換クライアントも同梱されています。

% dolt sql-client
# Welcome to the Dolt MySQL client.
# Statements must be terminated with ';'.
# "exit" or "quit" (or Ctrl-D) to exit.
mysql>

実行した他のターミナルには、次のログ行が表示されます。

dolt sql-server

2022-06-06T13:14:32-07:00 INFO [conn 1] NewConnection {DisableClientMultiStatements=false}

あなたは接続されています!

ここにいる間に、MySQLのコピーを取得して、そのクライアントと接続できるようにしましょう。MySQL 入門ドキュメントにアクセスして、マシンに MySQL をインストールします。私は自分のMacにMySQLをインストールするために自作を使用しました。

MySQL には、と呼ばれる MySQL サーバーと と呼ばれる MySQL クライアントが付属しています。あなたはクライアントにのみ興味があります。MySQL のドキュメントの指示に従った後、パスにクライアントのコピーがあることを確認します。

mysqld
mysql
mysql

% mysql --version
mysql  Ver 8.0.29 for macos12.2 on x86_64 (Homebrew)

ここで、クライアントを Dolt に接続するには、ホストとポートを渡して MySQL クライアントを TCP インターフェイス経由で強制します。デフォルトは Dolt がサポートするソケットインタフェースですが、 でのみ使用可能です。したがって、TCPインターフェイスを披露することをお勧めします。MySQL クライアントでは、ユーザー (この場合は) も指定する必要があります。

mysql
localhost
root

% mysql --host 127.0.0.1 --port 3306 -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.9-Vitess 

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

繰り返しになりますが、クライアントが実際に接続されていることを確認するために、ターミナルに次のように表示されます。

dolt sql-server

2022-06-06T13:26:55-07:00 INFO [conn 2] NewConnection {DisableClientMultiStatements=false}

ご覧のとおり、Dolt は MySQL 互換のクライアントをサポートしています。Dolt にはクライアントに同梱されていますが、MySQL に付属しているような任意の MySQL クライアントを使用できます。

スキーマを作成する

これで、実際に何か面白いことをする準備が整いました。クライアントにとどまり、次の SQL ステートメントを実行して、というデータベースを作成します。データベースには、および の 3 つのテーブルがあります。

mysql
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 は、Git スタイルのインターフェイスを通じてバージョン管理機能を公開します。コマンドラインでは、Dolt コマンドは Git の同等のコマンドに正確にマップされ、ターゲットはファイルではなくテーブルになります。SQL では、Dolt はバージョン管理の読み取り操作をシステム テーブルとして公開し、バージョン管理の書き込み操作をストアド プロシージャとして公開します。

システム テーブルとストアド プロシージャの名前付けは、このパターンに従います。したがって、CLIではストアドプロシージャになります。オプションの受け渡しもコマンドラインモデルに従います。たとえば、追加するテーブルを指定するには、テーブル名をオプションとしてプロシージャに送信します。コマンドにメッセージを送信するような名前付き引数の場合は、のように2つの引数を順番に使用します。Git の知識があれば、バージョン管理手順とシステム テーブルは使い慣れているはずです。

dolt_<command>
dolt add
dolt_add
dolt_add
dolt_commit
('-m', 'This is a message')

そのため、新しいスキーマを追加してコミットします。

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  | tim@dolthub.com | 2022-06-07 16:35:49.277 | Created initial schema     |
| vluuhvd0bn59598utedt77ed9q5okbcb | Tim Sehn  | tim@dolthub.com | 2022-06-07 16:33:59.531 | Initialize data repository |
+----------------------------------+-----------+-----------------+-------------------------+----------------------------+
2 rows in set (0.01 sec)

そこにあります。スキーマが作成され、システムテーブルに表示されるように、作成を追跡するDoltコミットがあります。

dolt_log

Dolt コミットは標準の SQL トランザクションとは異なることに注意してください。この場合、AUTOCOMMITをオンにしてデータベースを実行しているため、各SQLステートメントは自動的にトランザクションを生成します。トランザクションごとに Dolt コミットを生成する場合は、システム変数 @@dolt_transaction_commit を使用します。

COMMIT
COMMIT

データを挿入する

次に、DoltHub の数人の従業員をデータベースに入力します。次に、従業員をエンジニアリングと営業の 2 つのチームに割り当てます。CEOはスタートアップで多くの帽子をかぶっているので、複数のチームに割り当てられます。

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)

すべてが挿入され、正しいように見えます。その3つの表を使用してエンジニアリングチームのメンバーをリストすることができました。Dolt は最大 12 個のテーブルをサポートします。繰り返しになりますが、Dolt は最新の SQL リレーショナル データベースであり、Git スタイルのバージョン管理とペアになっています。

JOIN
JOIN

差分を調べる

では、コミットする前にワーキングセットの変更を確認したい場合はどうでしょうか。とシステム テーブルを使用します。

dolt_status
dolt_diff_<tablename>

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)

を使用してログを調べ、スコープ外の .Unscoped は、テーブルの特定のコミットでスキーマ、データ、またはその両方が変更されたかどうかを示します。

dolt_log
dolt_diff
dolt_diff

mysql> select * from dolt_log;
+----------------------------------+-----------+-----------------+-------------------------+----------------------------+
| commit_hash                      | committer | email           | date                    | message                    |
+----------------------------------+-----------+-----------------+-------------------------+----------------------------+
| 13qfqa5rojq18j84d1n2htjkm6fletg4 | Tim Sehn  | tim@dolthub.com | 2022-06-07 16:39:32.066 | Populated tables with data |
| ne182jemgrlm8jnjmoubfqsstlfi1s98 | Tim Sehn  | tim@dolthub.com | 2022-06-07 16:35:49.277 | Created initial schema     |
| vluuhvd0bn59598utedt77ed9q5okbcb | Tim Sehn  | tim@dolthub.com | 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  | tim@dolthub.com | 2022-06-07 16:39:32.066 | Populated tables with data |           1 |             0 |
| 13qfqa5rojq18j84d1n2htjkm6fletg4 | employees       | Tim Sehn  | tim@dolthub.com | 2022-06-07 16:39:32.066 | Populated tables with data |           1 |             0 |
| 13qfqa5rojq18j84d1n2htjkm6fletg4 | employees_teams | Tim Sehn  | tim@dolthub.com | 2022-06-07 16:39:32.066 | Populated tables with data |           1 |             0 |
| ne182jemgrlm8jnjmoubfqsstlfi1s98 | employees       | Tim Sehn  | tim@dolthub.com | 2022-06-07 16:35:49.277 | Created initial schema     |           0 |             1 |
| ne182jemgrlm8jnjmoubfqsstlfi1s98 | employees_teams | Tim Sehn  | tim@dolthub.com | 2022-06-07 16:35:49.277 | Created initial schema     |           0 |             1 |
| ne182jemgrlm8jnjmoubfqsstlfi1s98 | teams           | Tim Sehn  | tim@dolthub.com | 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)

従来のデータベースでは、これは悲惨なことになる可能性があります。Doltでは、テーブルを取り戻すのに1つのコマンドがあります。

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() を使用して特定のコミットを元に戻すこともできます。

Dolt で回復できない SQL ステートメントは だけです。これにより、データベースとそのすべての履歴がディスク上に削除されます。 インポートツールがインポート前にすべてのデータベース状態をクリアするためにaを発行するのが一般的であるため、SQLツールの互換性のためにこのように機能します。DoltはGitのようにリモートを実装しているため、クローン、フェッチ、プッシュ、プルを使用してバックアップ用のオフラインコピーを維持できます。リモート・コピーを保持すると、誤った照会が発生した場合にリストアできます。

drop database
drop database
drop database
drop database

SQL ワークベンチのデータを表示する

コマンドラインが嫌いですか?テーブルプラスを使用していくつかの変更を加えましょう。Tableplus は無料の SQL Workbench です。彼らのウェブサイトからのインストール手順に従ってください。

ここで、接続するには、接続タイプとしてMySQLを選択する必要があります。次に、接続の名前、データベース、およびユーザーの名前を入力します。

getting_started
root

テーブルプラス接続

「接続」をクリックすると、使い慣れたデータベース・ワークベンチ GUI が表示されます。

テーブルプラス

ブランチに変更を加える

To make changes on a branch, I use the stored procedure. Using the option creates a branch, just like in Git.

dolt_checkout()
-b

Tableplus gives me the ability to enter a multiple line SQL script on the SQL tab. I entered the following SQL to checkout a branch, update, insert, delete, and finally Dolt commit my changes.

call dolt_checkout('-b','modifications');
update employees SET first_name='Timothy' where first_name='Tim';
insert INTO employees (id, first_name, last_name) values (4,'Daylon', 'Wilkins');
insert into employees_teams(team_id, employee_id) values (0,4);
delete from employees_teams where employee_id=0 and team_id=1;
call dolt_commit('-am', 'Modifications on a branch');

Here's the result in Tableplus.

New Updates

Back in my terminal, I cannot see the table modifications made in Tableplus because they happened on a different branch than the one I have checked out in my session.

mysql> select * from dolt_branches;
+---------------+----------------------------------+------------------+------------------------+-------------------------+----------------------------+
| name          | hash                             | latest_committer | latest_committer_email | latest_commit_date      | latest_commit_message      |
+---------------+----------------------------------+------------------+------------------------+-------------------------+----------------------------+
| main          | 13qfqa5rojq18j84d1n2htjkm6fletg4 | Tim Sehn         | tim@dolthub.com        | 2022-06-07 16:39:32.066 | Populated tables with data |
| modifications | uhkv57j4bp2v16vcnmev9lshgkqq8ppb | Tim Sehn         | tim@dolthub.com        | 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)

I can query the branch no matter what I have checked out using SQL syntax.

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)

If I'd like to see the diff between the two branches, I can use the table function. It takes two branches and the table name as arguments.

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)

As you can see, you have the full power of Git-style branches and diffs in a SQL database with Dolt.

Make a schema change on another branch

I can also make schema changes on branches for isolated testing of new schema. I'm going to add a column on a new branch and populate it.

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)

Changing schema on a branch gives you a new method for doing isolated integration testing of new schema changes.

Merge it all together

Let's assume all the testing of the new schema on the branch and data on the branch completed flawlessly. It's time to merge all our edits together onto . This is done using the stored procedure.

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)

Schema change successful. We now have start dates. Data changes are next.

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)

Data changes successful as well. As you can see, I am now "Timothy" instead of "Tim", Daylon is added, and we all have start dates except for Daylon who was added on a different branch.

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)

I'm also gone from the Sales Team. Engineering is life.

I have to commit all my changes because the last merge was not a fast-forward merge.

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  | tim@dolthub.com | 2022-06-07 17:10:02.07  | Merged all branches                  |
| pg3nfi0j1dpc5pf1rfgckpmlteaufdrt | Tim Sehn  | tim@dolthub.com | 2022-06-07 16:44:37.513 | Added start_date column to employees |
| uhkv57j4bp2v16vcnmev9lshgkqq8ppb | Tim Sehn  | tim@dolthub.com | 2022-06-07 16:41:49.847 | Modifications on a branch            |
| 13qfqa5rojq18j84d1n2htjkm6fletg4 | Tim Sehn  | tim@dolthub.com | 2022-06-07 16:39:32.066 | Populated tables with data           |
| ne182jemgrlm8jnjmoubfqsstlfi1s98 | Tim Sehn  | tim@dolthub.com | 2022-06-07 16:35:49.277 | Created initial schema               |
| vluuhvd0bn59598utedt77ed9q5okbcb | Tim Sehn  | tim@dolthub.com | 2022-06-07 16:33:59.531 | Initialize data repository           |
+----------------------------------+-----------+-----------------+-------------------------+--------------------------------------+
6 rows in set (0.00 sec)

Now, we have a database with all the schema and data changes merged and ready for use.

Audit Cell Lineage

Which commit changed my first name? With Dolt you have lineage for every cell in your database. Let's use the and to explore the lineage features in Dolt.

dolt_history_<tablename>
dolt_diff_<tablename>

dolt_history_<tablename>
shows you the state of the row at every commit.

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_<tablename>
問題のセルが変更されたときにのみコミットするように履歴をフィルタリングできます。この場合、私は自分の名を変更しているコミットに興味があります。1つは元の変更であり、もう1つはマージコミットであるため、私の名前を変更した2つのコミットがあることに注意してください。

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の感触をつかんだので、ドキュメントにアクセスしてください。また、私たちが取り組んできたことについては、ブログで読むこともできます。

クレジットとライセンス

ドルトは、Nomsプロジェクトのオープンソースコードとアイデアに大きく依存しています。私たちは非常に このコードを自由に利用できるようにしてくれたNomsチームに感謝します。 それがなければ、ドルトをこれほど迅速に構築することはできなかったでしょう。

Dolt は Apache ライセンスバージョン 2.0 の下でライセンスされています。ライセンスを参照してください 細部。