非マイグレーション管理で,さらに 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 を修正するプルリクを出してマージしてもらった.