2012年10月1日月曜日

テーブルにカラムの追加と削除を行う最小サンプル


一度作成したテーブルにカラムを追加してみる。

▽現状のSchema
  create_table "onecolumnmodels", :force => true do |t|
    t.string   "name"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end
まずは空の migration ファイルを作成する。
G:\Sites\mytest>rails g migration add_thirdname_onecolumnmodel
      invoke  active_record
      create    db/migrate/20120930223614_add_thirdname_onecolumnmodel.rb
"rails generate" は "rails g" で代用できるようだ。
作成されたmigrationファイルを開くと下記のようになっている。
class AddThirdnameOnecolumnmodel < ActiveRecord::Migration
  def up
  end

  def down
  end
end
def up のところに追加したい内容を、def down のところに元に戻す内容を追加する。
class AddThirdnameOnecolumnmodel < ActiveRecord::Migration
  def up
    add_column :onecolumnmodels, :thirdname, :string
  end

  def down
    remove_column  :onecolumnmodels, :thirdname
  end
end
この状態で、migration を実行。
G:\Sites\mytest>rake db:migrate
==  AddThirdnameOnecolumnmodel: migrating =====================================
-- add_column(:onecolumnmodels, :thirdname, :string)
   -> 0.0070s
==  AddThirdnameOnecolumnmodel: migrated (0.0080s) ============================
実行後に、db/schema.rb の内容を確認すると、thirdname が追加されている。
  create_table "onecolumnmodels", :force => true do |t|
    t.string   "name"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
    t.string   "thirdname"
  end
元に戻したい場合は、下記のように version を指定して migration を実行する。
rake db:migrate VERSION=1
ではどこに version が記載されているかというと、railsのデータベース内の schema_migrations というテーブルに記録されているようだ。


最後の行が直近で追加したバージョン番号(migrationファイルについているシリアル番号と同じ)なので、一つ前のバージョンを指定して migration してみる。
G:\Sites\mytest>rake db:migrate VERSION=20120928013904
==  AddThirdnameOnecolumnmodel: reverting =====================================
-- remove_column(:onecolumnmodels, :thirdname)
   -> 0.2440s
==  AddThirdnameOnecolumnmodel: reverted (0.2460s) ============================
実行後に、db/schema.rb の内容を確認すると、thirdname が削除されている。
  create_table "onecolumnmodels", :force => true do |t|
    t.string   "name"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

0 件のコメント:

コメントを投稿