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
#!/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
#!/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 変数に書き込まれるので、これでバージョンを指定できます。
#!/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 をつくる場合は最低限なものであればこれだけです。
class User < Sequel::Model; end
users テーブルと関連づけられ、様々な操作が行えます。手軽にデータベースを操作したい場合に使っていきたいと思う ORM です。