Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新

Mar 13, 2026 - 日記

PostgreSQL互換でブランチできる DB、DoltgreSQL がかなり面白い

PostgreSQL互換でブランチできる DB、DoltgreSQL がかなり面白い

「DBのスキーマだけじゃなくて、データそのものにも Git みたいにブランチ切れたら楽なのに」——PostgreSQL でマイグレーションを運用していると、一度はそう思ったことがあるんじゃないでしょうか。

DoltgreSQL は、まさにそれを実現するデータベースです。PostgreSQL 互換のワイヤプロトコルを持ちながら、内部では Git ライクなバージョン管理エンジンが動いていて、SQL だけで branch / merge / diff が全部できます。本記事では、インストールから基本的なブランチ操作まで試した感想をまとめます。

DoltgreSQL とは

DoltgreSQL は、DoltHub が開発しているオープンソースのデータベースです。もともと MySQL 互換の Dolt というバージョン管理 DB があり、その PostgreSQL 版として開発されました。

主な特徴:

  • Git のように branch / merge / diff / clone ができるリレーショナル DB
  • 標準の PostgreSQL クライアント(psql、pgAdmin 等)でそのまま接続可能
  • バージョン管理操作はすべて SQL 関数・プロシージャ経由
  • 2025年4月から Beta ステータス

なぜ面白いのか

1. データにもブランチワークフローが使える

コードには当たり前にブランチを切るのに、データベースの変更は一発勝負——という状況はよくあります。DoltgreSQL なら:

  • 本番 DB をブランチ → ステージングで変更適用 → テスト → マージ
  • データの「プルリクエスト」的な運用で、変更をレビューしてからマージ
  • スキーマだけでなく データそのものに diff が取れる

Supabase のマイグレーション で苦労した経験があると、この仕組みのありがたみがわかります。

2. AI エージェントとの相性

最近 AI エージェントから DB を操作する ユースケースが増えていますが、エージェントに本番 DB を直接触らせるのは怖い。DoltgreSQL なら:

  • エージェントがブランチ上で書き込み → 人間がレビューしてマージ
  • 破壊的変更のリスクを branch isolation で軽減
  • 問題があれば DOLT_RESET で簡単にロールバック

3. PostgreSQL 互換

既存のアプリケーションや ORM をほぼそのまま使えます。sqllogictest ベンチマークでは 569 万テスト中 519 万テストが通過(91.17% の互換性)。完璧ではないですが、多くのユースケースで十分な互換性です。

インストール

Linux / macOS

インストールスクリプトが用意されています。バイナリをダウンロードして PATH に配置する仕組みです。

1
sudo bash -c 'curl -L https://github.com/dolthub/doltgresql/releases/latest/download/install.sh | bash'

Docker で試す

手っ取り早く試すなら Docker が楽です。以下のコマンドで DoltgreSQL サーバが起動し、ポート 5432 で待ち受けます。

1
2
3
4
5
docker run -d \
  --name doltgresql \
  -e DOLTGRES_PASSWORD=mypassword \
  -p 5432:5432 \
  dolthub/doltgresql:latest

サーバの起動(バイナリの場合)

バイナリでインストールした場合は doltgres コマンドでサーバを起動します。

1
doltgres

デフォルトでは ~/.doltgres/databases 配下にデータが保存されます。環境変数でカスタマイズ可能です:

  • DOLTGRES_DATA_DIR — データ保存先
  • DOLTGRES_USER — スーパーユーザ名(デフォルト: postgres
  • DOLTGRES_PASSWORD — パスワード(デフォルト: password

接続

起動したら psql で普通に接続できます。

1
PGPASSWORD=mypassword psql -h localhost -U postgres

接続すると、普通の PostgreSQL のように見えます。ここから先がバージョン管理の世界です。

基本操作: ブランチ / コミット / マージ

DoltgreSQL のバージョン管理操作はすべて SQL で行います。Git コマンドとの対応を意識しながら見ていきましょう。

テーブルの作成とコミット

まず、普通にテーブルを作ってデータを入れます。

1
2
3
4
5
6
7
8
9
CREATE TABLE users (
  id    SERIAL PRIMARY KEY,
  name  TEXT NOT NULL,
  email TEXT NOT NULL
);

INSERT INTO users (name, email) VALUES
  ('田中太郎', 'tanaka_demo'),
  ('鈴木花子', 'suzuki_demo');

ここまでは普通の PostgreSQL と同じです。次に、この変更をコミットします。Git の git add -A && git commit に相当します。

1
2
SELECT dolt_add('-A');
SELECT dolt_commit('-m', 'usersテーブルを作成');

ブランチを切る

新しいブランチを作成して切り替えます。Git の git checkout -b と同じ感覚です。

1
CALL DOLT_CHECKOUT('-b', 'feature-add-role');

ブランチ上でスキーマとデータを変更します。

1
2
ALTER TABLE users ADD COLUMN role TEXT DEFAULT 'member';
UPDATE users SET role = 'admin' WHERE name = '田中太郎';

変更をコミットします。

1
2
SELECT dolt_add('-A');
SELECT dolt_commit('-m', 'roleカラムを追加、田中をadminに設定');

diff で変更を確認

main ブランチとの差分を確認します。DOLT_DIFF テーブル関数を使うと、行単位で何が変わったか見えます。

1
SELECT * FROM DOLT_DIFF('main', 'feature-add-role', 'users');

スキーマの差分だけ見たい場合は DOLT_SCHEMA_DIFF が便利です。

1
SELECT * FROM DOLT_SCHEMA_DIFF('main', 'feature-add-role', 'users');

マージ

問題なさそうなら main に戻ってマージします。

1
2
CALL DOLT_CHECKOUT('main');
CALL DOLT_MERGE('feature-add-role');

コンフリクトが発生した場合は DOLT_CONFLICTS テーブルで確認できます。事前にコンフリクトの有無を確認するには:

1
SELECT * FROM DOLT_MERGE_STATUS;

コミット履歴の確認

dolt.log でコミット履歴を確認できます。Git の git log に相当します。

1
SELECT * FROM dolt.log;

ステータスの確認

未コミットの変更を確認するには dolt.status を使います。git status と同じ感覚です。

1
SELECT * FROM dolt.status;

現実的な制約

正直に書いておくと、制約もそれなりにあります。

項目状況
パフォーマンスPostgreSQL 比で約 5.2x のオーバーヘッド(read 6.3x / write 3.6x)
ステータスBeta(2025年4月16日〜)。本番利用は可能だがバグの可能性あり
エクステンション未対応(PostGIS 等は使えない)
レプリケーション未対応(開発中)
DoltHub/DoltLab 連携未対応(S3・ファイルシステムなどカスタムリモートは可)
CLI バージョン管理SQL 経由のみ(dolt CLI は使えない)

パフォーマンスの 5.2x オーバーヘッドは気になるところですが、ステージング環境や設定データの管理など、スループットが最優先ではないユースケースなら許容範囲だと思います。PgDog のようなプロキシ を前段に置くような高スループットの用途には向きません。

どんな人に向いているか

  • DB マイグレーションの安全性を高めたいチーム
  • データの変更履歴を完全に追跡したいプロジェクト(監査要件がある場合など)
  • AI エージェントに DB 操作をさせたいが、安全ネットが欲しいケース
  • 設定データや ML feature store のバージョン管理

どんな人には向かないか

  • 高いクエリ性能が最優先のプロダクション OLTP
  • PostgreSQL エクステンション(PostGIS 等)に依存しているプロジェクト
  • すでに Liquibase / Flyway 等でマイグレーション管理が十分回っているチーム

まとめ

DoltgreSQL は「データベースに Git のワークフローを持ち込む」という、ありそうでなかったアプローチのプロダクトです。

正直、パフォーマンスの 5.2x オーバーヘッドや Beta ステータスを考えると、今すぐ本番の OLTP に投入するのは厳しい。ただ、ステージング環境でのマイグレーション検証、AI エージェントの書き込みを安全にレビューするワークフロー、設定データのバージョン管理——こういった用途ではかなり強力です。

個人的に一番面白いと思ったのは、DOLT_DIFF でデータの行レベル差分が SQL で取れるところ。スキーマの diff はツールがあるけれど、「この行のこの値が変わった」を追跡できるのは他にはなかなかない。

PostgreSQL 互換率 91% という数字が示すとおり、まだ完全ではないですが、開発は活発に進んでいます。興味がある方はまず Docker で試してみてください。

参考リンク

関連記事