Dolt は、Git リポジトリと同じようにフォーク、クローン、ブランチ、マージ、プッシュ、プルができる SQL データベースです。
MySQL データベースと同じように Dolt に接続して、スキーマやデータを読み取りまたは変更します。バージョン管理機能は、システム テーブル、関数、プロシージャを介して SQL で公開されます。
または、Git のようなコマンド ライン インターフェイスを使用して、CSV ファイルをインポートしたり、変更をコミットしたり、リモートにプッシュしたり、チームメイトの変更をマージしたりできます。 Git で知っているすべてのコマンドは、Dolt でもまったく同じように機能します。
Git バージョン ファイル。 Dolt のバージョン表。 Git と MySQL に赤ちゃんが生まれたようなものです。
また、Dolt データベースを共有する場所である DoltHub も構築しました。私たちは公開データを無料でホストしています。独自のバージョンの DoltHub をホストしたい場合は、DoltLab をご利用ください。 Dolt サーバーの実行をご希望の場合は、Hosted Dolt をご利用ください。 Dolt の Postgres バージョンをお探しの場合は、DoltgreSQL を構築しました。警告、これは初期のアルファ版です。 Dolt は本番環境に対応しています。
Discord に参加して挨拶したり質問したり、ロードマップをチェックして次に何を構築するかを確認してください。
たくさんのこと! Dolt は、無数のアプリケーションを備えた一般的に便利なツールです。ただし、アイデアが必要な場合は、これまでに人々がどのように使用しているかをここに示します。
Dolt は、標準の MySQL バイナリ ログ レプリケーションを使用して、既存の 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
上にあります。
インストール スクリプトでは、 dolt
/usr/local/bin
に配置するために sudo が必要です。 root 権限を持っていない場合、または root 権限を使用してスクリプトを実行することに慣れていない場合は、最新リリースからプラットフォーム用の dolt バイナリをダウンロードし、解凍して、そのバイナリを$PATH
上のどこかに置くことができます。
Dolt は Arch Linux の公式リポジトリにパッケージ化されています。
pacman -S dolt
Dolt は Homebrew 上にあり、リリースごとに更新されます。
brew install dolt
macOS では、MacPorts 経由でコミュニティ管理のポート経由で Dolt をインストールすることもできます。
sudoポートでドルトをインストール
最新の Microsoft インストーラー ( .msi
ファイル) をリリースでダウンロードして実行します。
Windows での実行については、こちらを参照してください。
Chocolatey を使用してdolt
インストールできます。
チョコインストールドルト
Dolt には次の公式 Docker イメージがあります。
Dolt を CLI ツールとして実行するためのdolthub/dolt
。
Dolt をサーバー モードで実行するためのdolthub/dolt-sql-server
。
Go がインストールされていること、およびgo
パス内にあることを確認してください。 Dolt は cgo に依存しているため、動作する C コンパイラとツールチェーンも必要になります。
このリポジトリのクローンを作成し、 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 シェルで。まだディレクトリを作成してそこに移動する以外は何もしないでください。
Dolt には、MySQL 互換データベース サーバーが組み込まれて出荷されます。 Dolt を起動するには、コマンドdolt sql-server
使用します。このコマンドを実行すると、ポート 3306 でサーバーが起動します。
ドルト 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 Getting Started ドキュメントにアクセスし、MySQL をマシンにインストールします。 Homebrew を使用して MySQL を Mac にインストールしました。
MySQL にはmysqld
という MySQL サーバーとmysql
という MySQL クライアントが付属しています。あなたはクライアントにしか興味がありません。 MySQL のドキュメントの手順に従った後、 mysql
クライアントのコピーがパス上にあることを確認してください。
% mysql --version x86_64 上の macos12.2 用の mysql Ver 8.0.29 (Homebrew)
ここで、 mysql
クライアントを Dolt に接続するには、ホストとポートを渡すことによって、MySQL クライアントに TCP インターフェイスを強制的に経由させます。デフォルトは Dolt がサポートするソケット インターフェイスですが、 localhost
でのみ使用できます。したがって、TCP インターフェイスを誇示した方がよいでしょう。 MySQL クライアントでは、ユーザー (この場合はroot
を指定する必要もあります。
% mysql --host 127.0.0.1 --port 3306 -uroot MySQL モニターへようこそ。 コマンドは;で終わります。またはg。 MySQL 接続 ID は 2 です サーバーバージョン: 5.7.9-Vites 著作権 (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
の 3 つのテーブルがあります。
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')
のように 2 つの引数を連続して使用します。 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_log
システム テーブルに見られるように、スキーマが作成され、作成を追跡する Dolt コミットが作成されます。
Dolt コミットは標準 SQL トランザクションCOMMIT
とは異なることに注意してください。この場合、 AUTOCOMMIT
をオンにしてデータベースを実行しているため、各 SQL ステートメントはトランザクションCOMMIT
自動的に生成します。システムがトランザクションごとに Dolt コミットを生成するようにするには、システム変数@@dolt_transaction_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 つのテーブルJOIN
を使用して、エンジニアリング チームのメンバーをリストすることができました。 Dolt は最大 12 個のテーブルJOIN
サポートします。繰り返しになりますが、Dolt は、Git スタイルのバージョン管理と組み合わせられた最新の SQL リレーショナル データベースです。
さて、コミットを行う前にワーキングセットで何が変更されたかを確認したい場合はどうすればよいでしょうか? 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
でしたが、現在は値が設定されています。
今度は-am
使用して影響を受けるすべてのテーブルを追加する別の Dolt コミットで終了しましょう。
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)
従来のデータベースでは、これは悲惨な結果になる可能性があります。 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()
を使用して特定のコミットを取り消すこともできます。誤って間違ったデータベースに対してdrop database
を実行してしまった場合でも、Dolt ではdolt_undrop()
ストアド プロシージャを呼び出すことでその操作を元に戻すことができます。
コマンドラインが嫌いですか? Tableplus を使用していくつかの変更を加えてみましょう。 Tableplus は無料の SQL ワークベンチです。 Web サイトのインストール手順に従ってください。
ここで、接続するには、接続タイプとして MySQL を選択する必要があります。次に、接続の名前を入力し、データベースとしてgetting_started
、ユーザーとしてroot
。
「接続」をクリックすると、使い慣れたデータベース ワークベンチ GUI が表示されます。
ブランチに変更を加えるには、 dolt_checkout()
ストアド プロシージャを使用します。 -b
オプションを使用すると、Git と同様にブランチが作成されます。
Tableplus では、[SQL] タブに複数行の SQL スクリプトを入力できます。次の SQL を入力してブランチをチェックアウトし、更新、挿入、削除し、最後に Dolt によって変更がコミットされました。
call dolt_checkout('-b','modifications');従業員を更新 SET first_name='Timothy' where first_name='Tim';INSERT INTO 従業員 (id, first_name, last_name) 値 (4,'Daylon', 'Wilkins') ;employees_teams(team_id,employee_id) 値 (0,4) に挿入;employees_teams から削除従業員 ID = 0 およびチーム 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)
2 つのブランチの差分を確認したい場合は、 dolt_diff()
テーブル関数を使用できます。 2 つのブランチとテーブル名を引数として受け取ります。
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 スタイルのブランチと diff を最大限に活用できます。
新しいスキーマを個別にテストするためにブランチでスキーマを変更することもできます。新しいブランチに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)
データ変更も成功しました。ご覧のとおり、私は「Tim」ではなく「Timothy」になり、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_
、履歴をフィルタリングして、問題のセルが変更されたときのコミットのみを絞り込むことができます。この場合、私の名を変更しているコミットに興味があります。 1 つは元の変更で、2 つ目はマージ コミットであるため、私の名前を変更したコミットが 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 の雰囲気をつかんだところで、ドキュメントにアクセスしてください。私たちがこれまで取り組んできたことについては、ブログでもご覧いただけます。