Ruby
ActiveRecord

非Rails AppでActiveRecord::Migrationを使う + Rakeでバージョン管理する

More than 5 years have passed since last update.


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.rb002_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