golang-migrate の使い方
これは何?
- golang-migrate の使い方メモ
- Database として PostgreSQL を使用することを想定
ドキュメント
golang-migrate とは
- データベースのマイグレーションツール
- DB から DB への移行・・・ではなくスキーマを定義して DB に適用するマイグレーション
- CLI としてもライブラリとして使うことも出来る
golang-migrate/migrate: Database migrations. CLI and Golang library.
https://github.com/golang-migrate/migrate
使い方
マイグレーションファイルを作成する
migrate create
でマイグレーションファイルを作成する
migrate create -ext sql -dir ./db/migrations -seq create_users
-ext
: extention (拡張子) の指定- 上記の例では sql を使用しているので xxxxxx.up.sql, xxxxxx.down.sql というファイルが作成される
-dir
: マイグレーションファイルを作成するディレクトリの path-seq
: マイグレーションファイルにシーケンシャル番号を付与する- 000001_create_users.up.sql のような形で、ファイル名先頭にシーケンシャル番号が付与される
-seq
を指定しない場合はタイムスタンプが代わりに付与される
up ファイルには作成するテーブルやデータを定義する
CREATE TABLE IF NOT EXISTS users(
user_id serial PRIMARY KEY,
username VARCHAR (50) UNIQUE NOT NULL,
password VARCHAR (50) NOT NULL,
email VARCHAR (300) UNIQUE NOT NULL
);
down ファイルにはクリーンアップするクエリを定義する
DROP TABLE IF EXISTS users;
マイグレーションを実行する
POSTGRESQL_URL='postgres://postgres:password@localhost:5432/example?sslmode=disable'
migrate -database ${POSTGRESQL_URL} -path ./db/migrations up
PostgreSQL の場合は以下のようなコマンドでテーブル定義を確認できる
% psql mydatabase -c "\d users"
Table "public.users"
Column | Type | Collation | Nullable | Default
----------+------------------------+-----------+----------+----------------------------------------
user_id | integer | | not null | nextval('users_user_id_seq'::regclass)
username | character varying(50) | | not null |
password | character varying(50) | | not null |
email | character varying(300) | | not null |
Indexes:
"users_pkey" PRIMARY KEY, btree (user_id)
"users_email_key" UNIQUE CONSTRAINT, btree (email)
"users_username_key" UNIQUE CONSTRAINT, btree (username)
クリーンアップする場合は down すれば良い
migrate -database ${POSTGRESQL_URL} -path ./db/migrations down
試した環境
% sw_vers
ProductName: macOS
ProductVersion: 12.4
BuildVersion: 21F79
% migrate -version
v4.15.2