読者です 読者をやめる 読者になる 読者になる

standalone-migrations でデータベースをマイグレーション管理にする

非マイグレーション管理で,さらに Rails の規約に則ってないような,サービス稼働中の既存データベースをこれからマイグレーション管理にする方法を考えていて,standalone-migrations っていう Gem が良さそうだったので試してみた.基本的には GitHub の README.md が充実してるので,困ることはないと思うけど,簡単にまとめておく.

github.com

  • 今回の前提
    • MySQL を対象とする
    • 非マイグレーション管理のデータベースを対象とする
    • 複数データベースを管理できるような構成にする
      • Multiple database support
    • データベース名は xxx とする

使ってみた

Gemfile を作成する

source 'https://rubygems.org'

gem 'mysql', '~> 2.9.1'
gem 'standalone_migrations', '~> 2.1.4'

Rakefile を作成する

require 'standalone_migrations'
StandaloneMigrations::Tasks.load_tasks

Custom Configuration File を作成する

ファイル名は .xxx.standalone_migrations にする.

db:
  migrate: db/migrate/xxx
  schema: db/schema_xxx.rb
config:
  database: db/config_xxx.yml

Config File を作成する

ファイル名は db/config_xxx.yml にする.

development: &development
  adapter: mysql
  encoding: utf8
  database: xxx
  username: myuser
  password: mypassword

テーブル定義を抽出する

db:schema:dumpschema_xxx.rb が自動的に作成されるので,rake タスクを実行する.

bundle exec rake DATABASE=xxx DB=development db:schema:dump

DB っていう環境変数は名前が微妙だなと思うけど,コードを読むと RAILS_ENV に設定している.確かに非 Rails 案件で使う前提だから明示的に RAILS_ENV を設定するのも変だなー.ある意味納得した.

if !ENV["RAILS_ENV"]
  ENV["RAILS_ENV"] = ENV["DB"] || ENV["RACK_ENV"] || Rails.env || "development"
end

マイグレーションファイルを作成して実行する

あとはもう普通のマイグレーションファイルを書いて,同じく rake タスクを実行する.ちなみに,マイグレーションは Rails と同じようなシンタックスで書いてもいいし,execute 構文を使えば,SQL を書くこともできるので,Rails の規約に則ってなくても,基本的にどんなテーブルでもマイグレーション管理ができる.

bundle exec rake DATABASE=xxx DB=development db:migrate

最終的なファイル構成はこんな感じ

.
├── Gemfile
├── Rakefile
├── .xxx.standalone_migrations
└── db
    ├── migrate
    │   └── xxx
    │       └── 20140726233210_add_hoge_to_table.rb
    ├── config_xxx.yml
    └── schema_xxx.rb

まとめ

standalone_migrations 素晴らしい!

環境変数は RAILS_ENV を使う

環境を指定するときに環境変数 DB は使えなくて,正しくは RAILS_ENV を使う必要がある.README を修正するプルリクを出してマージしてもらった.

github.com