RDBのデータの構成管理ができるDoltとは

# はじめに

Dolt ( https://github.com/dolthub/dolt ) とは、RDBのデータやスキーマの情報をgitのようにバージョン管理できる OSS です。

様々な場面でデータを活用することが多くなる中で、品質の高いデータ作成やマスタデータの保守などデータマネジメントがより重要になってきています。ソースコードの管理については確固たる方法がある一方で、データ管理については、一般的な RDB システムを使ってもDBのシステム内でデータの管理を行うことは難しく、実際にはシステムとは別のドキュメントなどに記載したスキーマやデータのメタデータなどの情報をバージョン管理することが多いのではないでしょうか。

Doltでは、実際のデータに対してコミットやプッシュなどのgitのコマンドを使うことができます。これにより、ソースコードを管理するのと同様にデータの構成管理を行うことができます。

# DoltHubについて

Dolthub ( https://www.dolthub.com/ )  は Dolt で管理されたデータをホスティングするサービスです。Public に公開するデータを扱うリポジトリの場合には無償ですが、Private なリポジトリでは有償となります。
githubと同じようなプルリクエストの機能を提供するほか、データの中身を閲覧したり、SQLを発行する機能もあります。
なお、実際にいくつかの公開データがDolthubに登録されており、誰でもそれらのデータをcloneして使うことができます。

# 使いどころ

Dolt の使いどころとして筆者の考えるユースケースとして以下を挙げます。

* マスタデータ管理
 * RDB上で管理しているマスタデータが本番データと異なる場合と開発データで異なり、ソースコードの修正とあわせて変更される場合が該当します。
* 新規に登録するデータを管理したい場合
 * データ分析基盤上のデータで、新規に登録するデータを確認したい場合などが該当します。


DoltにはGitにおけるSourcetreeのような GUIによる支援機能を持ったツールは今のところないようなので、基本的にはCLIベースで操作を行うことになります。なお、Python で扱うためのインターフェースも用意されているので、プログラムから扱う場合にはこれを使用することになると思います。
以下の章では、ユースケースごとにCLIベースでのDoltの利用方法を紹介していきます。

## マスタデータ管理

RDB上で管理しているマスタデータがソースコードとあわせて変更される場合です。gitのブランチモデルを採用している場合、下記のようなケースに該当します。

![qiita2020#1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224408/eb71fa82-3286-9252-72a5-4cb1385334b9.png)

一般的には、リリースの都度データのパッチを作成しそれを反映することが多いと思います。ただし、本番環境での不具合対応などでデータの変更が発生した場合に、その後の後処理としてそれらを開発環境のデータとマージする作業が必要となりますが、それらを手動で行う場合にはミスも起こりやすくなりがちです。

これらの作業をDoltを使って実施するための手順を追っていきます。

### ブランチの作成

gitと同じようにブランチを作成します。gitに慣れていれば違和感なく作成できます。

``` sql 
$ dolt branch testbranch
$ dolt checkout testbranch 
```

### データ修正とDoltへのコミット

Doltでは標準SQLを使用できます。gitでは、自身が編集したソースコードをリポジトリに登録していくことになりますが、Doltにおいてソースコードの編集にあたるのがDDL、DMLを発行する作業になります。
また、変更内容をリポジトリに登録する作業においてはgitと同じaddやcommitなどのgitコマンドをそのまま利用できます。
ただし、例えばgit commit の amendオプションなど、doltには現在実装されていない機能もあるので注意が必要です。

``` sql
# SQL発行
$ dolt sql -q "CREATE TABLE qiita2020 ( day int, title varchar(80), primary key (day) )"

# 上記で発行したDDLをコミット
$ dolt add qiita2020
$ dolt commit -m "add table" 

$ dolt sql -q "INSERT INTO qiita2020 VALUES (23, 'RDBのデータの構成管理ができるDoltとは')";
$ dolt diff
diff --dolt a/qiita2020 b/qiita2020 
a/qiita2020 b/qiita2020
--- a/qiita2020 @ phe7j28i5c7f4nbijql6jcta48v8qefa
+++ b/qiita2020 @ p30vpbeic5lhejq4ft12inh0586te5oq
+-----+-----+------------------------+
|     | day | title                  |
+-----+-----+------------------------+
|  +  | 23  | RDBのデータの構成管理ができるDoltとは |
+-----+-----+---------------------------------------+ 

# 上記で発行したDMLをコミット
$ dolt add qiita2020
$ dolt commit -m "add data" 

# 最後にリモートにpush
$ dolt push 
```
リモートにプッシュすることで、Dolthub上でもデータが参照できるようになります。
![qiita2020#3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224408/6e07fdad-a758-775e-c945-ca6e6915c0e0.png)

### データのマージ

データの修正をブランチ上で行った後、データのマージを行いますが、こちらもgitと同じ感覚で操作を行うことができます。

```sql 
# マージ先のmasterブランチを取得。masterブランチが更新されている場合は pullコマンドで最新を取得できます。
$ dolt checkout master
Switched to branch 'master'
$ dolt pull

# master に testbranchをマージ
$ dolt merge testbranch 
Updating oj3gjrfa1ug9q84laej2j3e8p4ce36i..kbm0jis3sh84abjrbfbo4f3ddchdae4q
Fast-forward
```
なお、マージ実行時にコンフリクトが発生する場合があります。その場合にはconflictコマンドで修正したのち、競合を解決します。
ただし、同じカラムの修正や削除などが個々のブランチで発生した場合にコンフリクトが発生することを予想していたのですが、本記事の執筆時ではコンフリクトが発生せず、後に更新されたほうが優先されてしまうこととなりました。Doltでマージを行う場合には自動で作成されるマージコミットを信用せず、データの更新に矛盾が発生していないかを自身で確認しておいたほうが無難かもしれません。

### 既存システムとの同期

MySQLやOraleなど既存のDBMS を使っている場合には、Doltで管理しているデータをそのデータベースへ同期することができます。本稿では、そこまで検証ができなかったため、説明は割愛します。これらの機能を使いたい場合、下記のドキュメントを参照してください。
https://www.dolthub.com/docs/guides/sql-sync/

## 新規に登録するデータを管理したい場合

Dolthubは、データ分析者が参照するデータの基盤として活用することができます。
ただし、データ分析基盤を運用していくにあたって、その基盤内に登録されるデータの品質が重要です。誰もが好き勝手にデータを入れられると、データの中身が汚くなってしまうことがあります。それを防止するための一つの手段として github でもお馴染みのプルリクエストを活用します。

### プルリクエスト

#### プルリクエストの作成

前の章で行った通り、自分で作ったブランチでデータの登録を行った後、Dolthubの画面よりプルリクエストを作成できます。
スキーマやデータの変更点をDolthub上のdiffで確認することができます。コメントを入れて作成者に対応を促すこともできます。
なお、diffに対しては直接のコメントはできないようでした。

![qiita2020#2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224408/385b086e-2f36-e8d8-5a9c-8234a688f06a.png)

#### クエリdiffの活用

doltにある機能でユニークなのは、dolt diff のオプションでクエリ結果のdiffをとることができる機能です。
例えば、下記のコマンドでは件数の差分を取得することができます。
画面上だけでデータの差分を確認する場合にもデータが多い場合などは確認が大変になることもあると思います。その場合にも、このような機能も使いながら、チェックを行うとよいと思います。

``` sql
$ dolt diff -q "select count(1) from qiita2020"
+-----+----------+
|     | COUNT(1) |
+-----+----------+
|  <  | 0        |
|  >  | 1        |
+-----+----------+
```

#### プルリクエストのマージ

プルリクエストの確認が終わったら、最後にDolthub上で Merge ボタンを押して完了です。

![qiita2020#4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224408/36cd0cef-0100-70a3-d72b-b1c0889f5c6f.png)

# おわりに

今回はデータに対してバージョン管理ができる Dolt というサービスを紹介しました。
私が関わっている、データの作成業務のあるプロジェクトにおいてデータの管理方法に課題があり解決方法がないかを検討していたところ、当サービスに出会いました。
git に精通している人であればあまり迷わずに利用ができそうです。一方で、Git に比べれば当然ツールなどの充実度も劣るため、導入に対して制約があるかと思います。そのような点を許容できればデータに関してもツールの助けを借りて管理できるようになると思います。