LoginSignup
81
75

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-10-18

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

81
75
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
81
75