🔥

DBスキーマ管理ツールsqldefで遊んでみる

2024/09/23に公開

DBスキーマ管理ツール

DBスキーマの反映漏れなどでポコポコとインシデントが発生しまくった過去から、
いつか実プロジェクトでDBスキーマ管理ツールを使ってみたいと思っていた。

sqldefが後発で評判も良さそうなので触ってみる。

sqldefは、
DDLを比較することで自動で差分のALTER文などを生成してくれるツール。
主要なRDBは対応しているっぽい。

スライド

DBスキーマ管理ツールを使わない場合の問題点や、導入で見込める改善事項を以下スライドにまとめてみた。
本記事ではsqldefで遊んでみることがメインなので、スライドの内容説明は割愛する。

https://www.docswell.com/s/7799591/ZV11DL-2024-09-22-201210

遊び用のリポジトリ

気軽に遊ぶために、以下リポジトリにsqldefをコンテナで実行できるようにしたものと、
Postgresのdocker-compose.yamlを格納している。
https://github.com/ryoheiY/sqldef-demo

sqldef

以下Dockerfileでsqldef実行環境を用意。
Postgresのdocker-composeの説明は割愛する。

# ベースイメージを選択(Alpine Linuxを使用)
FROM alpine:latest

# sqldefのバージョンを指定
ENV SQLDEF_VERSION v0.17.19

# 必要なパッケージをインストール
RUN apk --no-cache add curl bash postgresql-client tar

# sqldef (pgsqldef) をダウンロードしてインストール

RUN curl -L https://github.com/k0kubun/sqldef/releases/download/${SQLDEF_VERSION}/psqldef_linux_amd64.tar.gz -o psqldef.tar.gz
RUN tar -xzf psqldef.tar.gz
RUN mv psqldef /usr/local/bin/ 
RUN rm psqldef.tar.gz

スキーマの比較

左が現在のDBのスキーマのDDL、右が変更予定のDDL

実践

以下コマンドで変更予定のDDLをdry-runしてみる。
/sqlディレクトリ直下に変更予定DDLが配置されるようにコンテナをリンクしている。

一応コマンドを説明すると、Postgres DBに接続し、現在のスキーマと/sql/schema.sqlの
変更予定DDLを比較して生成した差分のsqlを/sql/sqldef-output.sqlに出力する。

psqldef --dry-run --host=host.docker.internal --port=5434 --user=postgres \
  --password=postgres sample_db < /sql/schema.sql > /sql/sqldef-output.sql

/sql/sqldef-output.sqlに出力された内容を確認してみると、ちゃんと出力が得られている。
(適当に用意しただけなので内容薄いが、そこはご愛嬌)

-- dry run --
ALTER TABLE "public"."sample" ALTER COLUMN "age" TYPE numeric(2, 4);
ALTER TABLE "public"."sample" ADD COLUMN "age2" integer;

展望

CI/CDパイプラインに組み込んで、dry-runではなくそのまま自動反映するようにしてもいいし、
実際に反映はさせずに差分のALTER文などを生成させられるので、
プルリクエストなどでレビュー完了後にそのsqlを自動で反映させる、
などの運用が考えられる。

liquibaseなどと違い、差分を順序正しく適用する必要がなく、DDL(Create)だけ管理していれば
いいため、かなりDBスキーマ管理の労力が減らせるように思う。

CI/CDパイプラインに組み込むなら、

自動反映を何も考えずに行うと危ない(カラムの順序変わっていてテーブル作り直したり、とか)ので、
上記で述べたレビュー後に反映するような仕組みにしたり、
DBのダンプを取得した上で反映するパイプラインにする、

などの安全策は取りたい。

Discussion