はじめに
- きっかけは以前参画したプロジェクトにて、プロダクトごとにsqldefとFlywayを使い分けてマイグレーションを行っていたが、個人的にはsqldefの方が使いやすかったので、現在参画していのプロジェクトにも導入したいと思ったから。
- 制約:Linux版のバイナリファイルを使いまわす。
- 現在参画しているプロジェクトの開発端末はWindows、CI/CD環境はLinux
- どちらの環境でもLinux版の同じ実行ファイルを使ってマイグレーションを行いたい。
実施環境
- OS Windows11
- WSL Ubuntu-22.04
- DB YugabyteDB v.2.21.0.0-b545 ※ Postgresqlとの互換性あり
使用方法
事前準備
- WSLが使用できる状態にする
- Postgresqlが使用できる状態にする
実行ファイルを入手
-
https://github.com/sqldef/sqldef/releasesからお好みのリリースバージョンのpsqldef_linux_amd64.tar.gzをダウンロード
- 今回はv0.17.5のものを入手
- WSLを起動し、ダウンロードしたファイルの階層に移動
- 以下のコマンドで圧縮ファイルを解凍
tar xf psqldef_linux_amd64.tar.gz
SQLファイルを作成
- 以下のSQLファイルを作成
01_create_table.sql
CREATE TABLE employee (
emp_no CHAR(5) PRIMARY KEY,
first_name VARCHAR(15) NOT NULL,
last_name VARCHAR(15) NOT NULL,
age SMALLINT NOT NULL
);
- 上記ファイルを解凍したpsqldefの実行ファイルと同じ階層に配置
sqldefを実行
- 以下のコマンドを実行し、現状のDBとの差分を確認
PGPASSWORD={password} ./psqldef -h 127.0.0.1 -p 5433 -U {user_name} {database_name} < 01_create_table.sql --dry-run
出力結果
$ PGPASSWORD=postgres ./psqldef -h 127.0.0.1 -p 5433 -U postgres postgres < 01_create_table.sql --dry-run
-- dry run --
CREATE TABLE employee (
emp_no CHAR(5) PRIMARY KEY,
first_name VARCHAR(15) NOT NULL,
last_name VARCHAR(15) NOT NULL,
age SMALLINT NOT NULL
);
- 以下のコマンドを実行し、DDLを実行
PGPASSWORD={password} ./psqldef -h 127.0.0.1 -p 5433 -U {user_name} {database_name} < 01_create_table.sql
出力結果
$ PGPASSWORD=postgres ./psqldef -h 127.0.0.1 -p 5433 -U postgres postgres < 01_create_table.sql
-- Apply --
CREATE TABLE employee (
emp_no CHAR(5) PRIMARY KEY,
first_name VARCHAR(15) NOT NULL,
last_name VARCHAR(15) NOT NULL,
age SMALLINT NOT NULL
);
- 再度現状のDBとの差分を確認
PGPASSWORD={password} ./psqldef -h 127.0.0.1 -p 5433 -U {user_name} {database_name} < 01_create_table.sql --dry-run
出力結果
$ PGPASSWORD=postgres ./psqldef -h 127.0.0.1 -p 5433 -U postgres postgres < 01_create_table.sql
-- Nothing is modified --