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