Help us understand the problem. What is going on with this article?

非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

foloinfo
foloinfo / CEO at byus&co.ltd // Vimmer, 最近はめっきりReact
https://drip.ink
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした