LoginSignup
60
59

More than 5 years have passed since last update.

Sinatra-ActiverecordでDBをマイグレーションする

Last updated at Posted at 2014-05-07

sinatra/activerecordのrakeタスクを利用して、DBのマイグレーション処理を勉強したのでメモ。元々はherokuでDBを使うための方法を調べてたら、DBマイグレーションが必要となったのがきっかけ。herokuでの利用についてはまた今度まとめる。

ちなみに、rakeはRubyのビルドツール。JavaのAntみたいなもの。Rakefileにrakeタスクを記述しておくと、いろんなビルドができるようになる。

version

ruby: 2.0.0p451 (2014-02-24 revision 45167)
rake: 0.9.6
gem: 2.0.4
Bundler: 1.5.2

Gemfile

bundleは「./vendor/bundle」にインストールすることとする。
Gemfileは$ bundle initとすると、自動で生成される。

Gemfile.
source "http://rubygems.org"

gem 'sinatra'
gem 'activerecord'
gem 'sinatra-activerecord'

gemのインストールは、--pathオプションを利用してローカルにする。
--pathオプションを指定しないと、Systemにインストールされる。
$ bundle exec ***とすると、ローカルのgemを利用してくれる。

$ bundle install --path=vendor/bundle

Rakefileを作成する

今回はsinatra/activerecordのrakeタスクを利用する。
Rakefileに以下をrequireしておく。

Rakefile.
require 'sinatra/activerecord'
require 'sinatra/activerecord/rake'

そうすると、次のタスクが使えるようになる。rakeタスクを確認するコマンドrake -Tで確認。

$ bundle exec rake -T
***
rake db:create_migration    # create an ActiveRecord migration in ./db/migrate
rake db:migrate             # migrate your database
***

マイグレーション用ファイルを生成する

rake db:create_migrationコマンドを使って、マイグレーション用ファイルを生成する。
ここでは、sensorsというデータベースを作る。引数のNAMEは何でも良いが、慣習でcreate_***sとするらしい。

$ bundle exec rake db:create_migration NAME=create_sensors

「./db/migrate」フォルダが生成され、その中にマイグレーション用ファイル「(日付)_create_sensors.rb」が生成される。

マイグレーション用ファイルの中に、生成したいテーブル構成を記述する

ここでは、テーブルsensors、要素としてdtype,data,timeを作成する。
データベースでは、テーブル名を複数形にする。これも慣習。

調べると、self.upとself.downメソッドを定義するやり方と、changeメソッドを定義するやり方の2通りあるらしい。rakeのバージョンの違い?作り方を両方書いたが、私の環境では、changeメソッドが生成された。

(日付)_create_counts.rb
class CreateCounts < ActiveRecord::Migration
  def self.up
    create_table :sensors do |t| #=> この引数名「:sensors」がテーブル名になる
      t.string :dtype
      t.string :data
      t.string :time
      t.timestamps  #=> この一行でcreated_atとupdated_atのカラムが定義される
    end
  end
  def self.down
    drop_table :sensors
  end
end
(日付)_create_sensors.rb
class CreateCounts < ActiveRecord::Migration
  def change
    create_table :sensors do |t| #=> この引数名「:sensors」がテーブル名になる
      t.string :dtype
      t.string :data
      t.string :time
      t.timestamps  #=> この一行でcreated_atとupdated_atのカラムが定義される
    end
  end
end

生成するデータベースの種類とパスを記述する

herokuのDBがURL表記をサポートしているので、ここでもURL表記とする。Rakefileに接続するDBのURLを指定すれば、これを読み込み、自動でDBファイルを生成してくれる。ただ、Rubyアプリ側にも同様の記述をする必要があるため、ここではmodels/sensor.rbという別ファイルに記述して、RakefileとRubyアプリでrequireすることとする。ついでに、ORマッパーのクラスも作っておく。クラス名はテーブル名sensorsの単数形Sensorにすること。

URLはSQLite3を使う場合。

Rubyアプリ.rb
require './models/sensor.rb'
models/sensors.rb
ActiveRecord::Base.establish_connection('sqlite3:///sensor.db')
class Sensor < ActiveRecord::Base; end
Rakefile.
require 'sinatra/activerecord'
require 'sinatra/activerecord/rake'
require './models/sensor.rb'  # 追加

マイグレーションしてテーブルを生成する

最後に、$ rake db:migrateをすると、自動でテーブルとスキーマが生成される。

$ bundle exec rake db:migrate

これでsensors.dbdb/schema.rbが自動生成される。
あとは、RubyアプリでSensor<ActiveRecord::Baseクラスを利用するだけ。

参考にしたサイト

60
59
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
60
59