トップ «前の日記(2010-01-10) 最新 次の日記(2010-01-21)» 編集

Ussy Diary


2010-01-17

[Ruby][ORM]Sequel でマイグレーション

Ruby にある軽量 ORM Sequel を簡単に触ったことはあるのですが、マイグレーションもできるということで試してみました。

インストール

$ sudo gem install rake
$ sudo gem install sequel
$ sudo gem install sqlite3-ruby

構成

+app_root/
 +Rakefile
 +db/
  +migrate/
   +001_migrate.rb
   +002_migrate.rb

001_migrate.rb

#!/usr/bin/env ruby

Class.new(Sequel::Migration) do
  def up
    create_table :users do
      primary_key :id
      varchar :name, :size => 32, :unique => true
      varchar :salt, :size => 32, :null => false
      varchar :hashed_password, :size => 64, :null => false
      varchar :mail_address, :size => 128, :null => false
      timestamp :created_at
      timestamp :updated_at
    end

    add_index :users, :name
  end

  def down
    drop_index :users, :name
    drop_table :users
  end

end

002_migrate.rb

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

Class.new(Sequel::Migration) do
  def up
    create_table :tags do
      primary_key :id
      varchar :name, :size => 32
    end

    from(:tags).insert(:name => 'あとでやる')
    from(:tags).insert(:name => '明日から本気出す')
  end

  def down
    drop_table :tags
  end

end

クラスを匿名で生成していますが、意味づけを行う場合は名前をきちんとつけたほうが良いかもしれません。

Rake は引数を渡すと ENV 変数に書き込まれるので、これでバージョンを指定できます。

Rakefile

#!/usr/bin/env ruby

require 'rubygems'
require 'rake'
require 'sequel'
require 'sequel/extensions/migration'

namespace :db do
  desc "migrate database"
  task :migrate do
    target = target.to_i if (target = ENV['target'])
    current = current.to_i if (current = ENV['current'])

    DB = Sequel.connect("sqlite://db/app.sqlite3")
    Sequel::Migrator.apply(DB, './db/migrate', target, current)
  end
end

最新版 (version 2) にする

$ rake db:migrate

バージョンを 1 に戻す

$ rake db:migrate target=3

わざわざ rake しなくても、コマンドから migrate できます。 -m でマイグレーションファイルを格納しているディレクトリを指定、 -M でバージョンを指定します。

$ sequel -m ./db/migrate sqlite://db/keyself.db -M 1

マイグレーションとは関係ありませんが、 model をつくる場合は最低限なものであればこれだけです。

user.rb

class User < Sequel::Model; end

users テーブルと関連づけられ、様々な操作が行えます。手軽にデータベースを操作したい場合に使っていきたいと思う ORM です。