Edited at

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を読んでください