2012-10-29 [長年日記]
■sinatra-activerecordを使ってマイグレーションを作る
ための最低限の手続きのメモ。要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'
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
使い方が普通に書いてあるわけだが。