Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
26
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

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

概要

Go製のデータベースmigrationツールとして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を読んでください

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
26
Help us understand the problem. What are the problem?