Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

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

k-kurikuri
Goがお気に入りです
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away