Go
migration
golang

Go製マイグレーションツールsql-migrate

概要

Go製のデータベースmigrationツールとしてsql-migrateを使って開発しているのでコマンドや動作仕様などを簡単に書く。

公式リポジトリ

https://github.com/rubenv/sql-migrate

特徴

  • CLIツール
  • SQLite, PostgreSQL, MySQL, Oracleなどの色々なデータベースをサポート
  • スキーマの作成/変更/ロールバック機能
  • ソースコードからの実行制御
  • その他色々

インストール

$ go get github.com/rubenv/sql-migrate/...

詳細

公式のREADMEを見れば分かる事だけど日本語で書いていく

設定ファイル

デフォルトはdbconfig.ymlというファイル名で参照される。yml内のenvキーではdevelopment, productionなど環境ごとに設定を定義できる。migrationの実行を管理するテーブル名はgorp_migrationsdirは作成されたmigrationファイルの保存先。
オプションでこの辺りの名前は色々変更ができるし、デフォルトのままでも問題ない。

dbconfig.yml
development:
    dialect: mysql
    dir: db/migrations
    datasource: user_name:password@tcp(127.0.0.1)/dbname?charset=utf8mb4&collation=utf8mb4_general_ci&parseTime=true

production:
    dialect: postgres
    dir: migrations/postgres
    datasource: dbname=myapp sslmode=disable
    table: migrations

コマンド色々

# ヘルプ
$ sql-migrate --help
マイグレーション作成
# 以下のコマンドでは「20181005103536-create_users.sql」みたいなマイグレーションファイルが作成される
# ファイル名のdatetimeは自動で付与

$ sql-migrate new create_users
# マイグレーションの実行
$ sql-migrate up
# マイグレーションをdryrunで実行。実行予定のsqlが出力される
$ sql-migrate up -dryrun
# マイグレーションのロールバック
$ sql-migrate down
# マイグレーションの実行状態確認
$ sql-migrate status

マイグレーションファイルの内容

マイグレーション作成すると.sqlとしてファイルが生成される。sqlコメント文を使用しupの処理なのかdownの処理なのかを-- +migration Up-- +migration Downでそれぞれ指定する。

20181005103536-create_users.sql
-- +migrate Up
CREATE TABLE IF NOT EXISTS users (id int);

-- +migrate Down
DROP TABLE IF EXISTS users;

migrationの実行管理テーブル

マイグレーション初回実行時にgorp_migrationsというテーブルが自動で作成される。
このテーブルには実行したマイグレーションファイル名をインサートして実行済みか否かを管理してる。

終わり

本番環境でも使っていて特に問題はなし。
他にも色々な機能があるので詳しくは公式リポジトリのREADMEを読んでください