非マイグレーション管理で,さらに Rails の規約に則ってないような,サービス稼働中の既存データベースをこれからマイグレーション管理にする方法を考えていて,standalone-migrations っていう Gem が良さそうだったので試してみた.基本的には GitHub の README.md が充実してるので,困ることはないと思うけど,簡単にまとめておく.
- 今回の前提
- 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:dump で schema_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 を修正するプルリクを出してマージしてもらった.