ActiveRecord::Migration
便利ですよね。Railsプロジェクトに関係ない場合も使いたいです。
Migrationを直接走らせる
シンプルなrubyスクリプトを書くことで直接migrationを行うことが出来ます。
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => 'sqlite3',
:database => 'db.sqlite3'
)
ActiveRecord::Migration.create_table :samples do |t|
t.string :body
t.timestamps
end
あとはruby create_samples.rb
を実行すればmigrationが実行されます。
Rake Taskで実行する
railsの場合rake db:migrate
でバージョンの管理とか出来ますよね。
便利ですよね。rails外でも使いましょう。
db/migrate
ディレクトリーを作成する
非railsアプリのディレクトリ内で、db/migrate
を作りましょう。
内部には001_create_samples.rb
や002_create_something_else.rb
と言ったファイルを格納していきます。
001, 002と言った名前はバージョン管理に必要なのでちゃんと書きましょう。
migrationファイルの中身
railsと一緒です。
class CreateSamples < ActiveRecord::Migration
def self.up
create_table :samples do |t|
t.string :body
t.timestamps
end
end
def self.down
drop_table :samples
end
end
Rakefileを記述する
非RailsアプリのルートにRakefile
を作成します。
require 'active_record'
require 'yaml'
require 'erb'
require 'logger'
task :default => :migrate
desc "Migrate database"
task :migrate => :environment do
ActiveRecord::Migrator.migrate('db/migrate', ENV["VERSION"] ? ENV["VERSION"].to_i : nil )
end
task :environment do
dbconfig = YAML.load(ERB.new(File.read('config/database.yml')).result)
ActiveRecord::Base.establish_connection(dbconfig[ENV['ENV']])
ActiveRecord::Base.logger = Logger.new('db/database.log')
end
サンプルではdatabase.yml
内でERBを利用しているのでYAML.load(ERB.new(File.read('config/database.yml')).result)
としていますが、直接記述する場合はYAML::load(File.open('database.yml'))
でOKです。
Rakeタスクの実行
database.yml
を読み込む際dbconfig[ENV['ENV']]
として環境の指定を行っています。
タスク実行時にrake ENV=development
/ rake ENV=production
で切り替えが可能です。
またVERSION=x
を指定することで、指定の段階まで戻ったり進めたり出来るようになります。
rake ENV=development VERSION=0
でmigrate以前の状態に戻ったり
rake ENV=development
実行で最新の状態に出来ます。
上手くいかない場合は書きだしたlogの確認とかすると良いと思います。
複数人で開発を行う際、開発環境下でDBの状態を揃えるのは大切ですよね!
ActiveRecordは単体でも便利なので、もっと活用していきたいと思います。
参考:
RubyでActiveRecordのマイグレーション機能を単体で使用する | もっとクールにプログラミング
ActiveRecord Migrations Without Rails | Strange Symphonies