過去の日記

2012-10-29 [長年日記]

sinatra-activerecordを使ってマイグレーションを作る [tech][Ruby]

ための最低限の手続きのメモ。要Ruby1.9系(多分)。


bundlerを使う。

sudo gem install bundler


適当なフォルダを使う。

mkdir apptest
cd apptest


Gemfileを作る。

source 'https://rubygems.org'

ruby '1.9.3'

gem 'sinatra-activerecord', :require => 'sinatra/activerecord'
gem 'rake'

これだけ? これだけ*1*2


bundle install。依存関係からActiveRecordなんかが入る。

mkdir vendor
bundle install --path vendor/bundle


Rakefileを作る。

require 'sinatra/activerecord/rake'

これだけ。


この時点ですでに、

bundle exec rake -T

すると、

rake db:create_migration  # create an ActiveRecord migration in ./db/migrate
rake db:migrate           # migrate the database (use version with VERSION=n)
rake db:rollback          # roll back the migration (use steps with STEP=n)

というタスクが3つ登録済みになる。


ではさっそく、

bundle exec rake db:create_migration

すると、

rake aborted!
No NAME specified. Example usage: `rake db:create_migration NAME=create_users`

と、NAMEを指定してね、って言われる。


なので、

bundle exec rake db:create_migration NAME=create_users

すると、db/migrate ディレクトリが作られて、20121029xxxxxx_create_users.rb なんてファイルができている。

class CreateUsers < ActiveRecord::Migration
  def up
  end

  def down
  end
end

というおなじみ(?)Migration用のファイル。


中身をいれてやる。

class CreateUsers < ActiveRecord::Migration
  def up
    create_table :users do |t|
      t.string :user_id
      t.string :password
      t.timestamps
    end
  end

  def down
    drop_table :users
  end
end

とか作り込んでいく(ここで書いたのはちょう適当)。


で、Migrationを作っていって、

bundle exec rake db:migrate

ってやれば、最新のmigrationまで一気にやってくれる……わけがない。
だってどこのどんな種類のDBに操作するのか書いてないから。


……マイグレーションはできた。実行できないけど。


ここで終わっちゃあんまりなので。
GemfileにDBアクセスに必要なGemを追加。

source :rubygems

ruby '1.9.3'

gem 'sinatra-activerecord', :require => 'sinatra/activerecord'
gem 'rake'
gem 'sqlite3'

楽なsqlite3にしといた。

bundle install

を忘れずに。もちろんその前に apt-get なり、yum なり、brew なり、ports なりでsqlite3(とヘッダ類)をインストールしておかないといけない。


db/connection.rbなんて作っちゃう。

require "logger"

ActiveRecord::Base.establish_connection({
  :adapter   => "sqlite3",
  :database  => "myapp.db",
})

ActiveRecord::Base.logger = Logger.new($stderr)

loggerにまつわる部分も含めて必要なオマジナイ。


Rakefileでrequireする*3

require 'sinatra/activerecord/rake'
require './db/connection'


これで、

bundle exec rake db:migrate

が通るはず。

bundle exec rake db:rollback

すると1段階戻る。
おなじみのマイグレーション機能。


Sinatraアプリの中でもconfigureでdb/connection.rbを読んじゃえばdbアクセスできそうだけど、うまいやり方とは到底思えない*4のでどうしようか……。
GemfileにしろRakefileにしろ、必要な部分が分かるように、最小限にしか書いてないのは説明のため。

ここまでなんとなくやってきたけど、そろそろ sinatra-activerecord のドキュメントでも探しにいきますか……。


追記

https://github.com/janko-m/sinatra-activerecord/blob/master/README.md

使い方が普通に書いてあるわけだが。

*1 rbファイル内で Bundler.require を書かないのならrequireの部分は必要なわけじゃない。

*2 2013-04-01更新 source :rubygems から source 'https://rubygems.org' に変更した。

*3 bundle execで実行する都合上、require_relativeではなくrequireを使った。

*4 Sinatraのモードの概念をスポイルしちゃう。