データベースの仕組みとRubyプログラムの整理用サイトです

DBスキーマの定義をRailsで管理する際の差分(変更)を定義するための仕組みがマイグレーション。

基本コマンド

$ rake db:migrate

マイグレーションの仕組み

あるプロジェクトで次のようにDB更新があったとする。
実際は複数テーブルが入れ子担って更新されるが、今回は偶然productテーブルだけに変更があったとする。
実行順序実行内容実行コマンド備考
1productテーブルを追加するrails g migration CreateProducts通常はmodelかscaffoldを使用する
2productテーブルに"Kana"列を追加するrails g migration AddKanaToProducts kana:string
3productテーブルから"Kana"列を削除するrails g migration RemoveKanaFromProductsマイグレーションファイルに付く日付を20080906120000とする。
4productテーブルを削除するrails g migration DestroyProducts通常はmodelかscaffoldを使用する

コマンドを実行すると、テーブルを変更するためのファイル(マイグレーションファイル)が生成されるので、希望にそって変更しておく必要がある。マイグレーションファイルは差分ファイルの為、テーブル定義がどのように変更されるかを記述する。

最新に変更する場合は何も考えず、このページの一番上のコマンドを実行する。
しかし、実行順序3の実行後に変更するように途中まで実行する場合は次のコマンドを実行する。
$ rake db:migrate VERSION=20080906120000

現在のバージョンを取得するには次のコマンドを実行する。
$ rake db:version
なお、現在のDBの状態はDB上のschema_infoテーブルに保存されている。

マイグレーションファイル

db/migration/20101103070907_create_posts.rb
require 'migration_helper'
class CreatePosts < ActiveRecord::Migration
  # 外部キー用のモジュールを使えるように拡張する.
  extend MigrationHelper

  def self.up
    create_table :posts do |t|
      t.string :title
      t.text :body
      t.timestamps
    end
  end

  def self.down
    drop_table :posts
  end
end

テーブル操作に関するメソッド

メソッド名意味
1create_table(name, options)テーブルを作成する
2drop_table(name)テーブルを削除する
3rename_tableテーブル名を変更する
4add_column(table_name, column_name, type, options)カラムを追加する
5remove_column(table_name, column_name)カラムを削除する
6rename_columnカラム名を変更する
7executeSQLを実行する
8add_index(table_name, column_names, index_type, index_name)インデックスを追加する
9remove_index(table_name, index_name)インデックスを削除する

使用可能な型名

型名意味
1string文字列
2text長い文字列
3integer整数
4float浮動小数
5decimal固定長整数
6datetime日時
7timestampタイムスタンプ
8time時刻
9date日付
10binaryバイナリ
11boolean真偽値

オプション

オプション意味
1:nullfalseにするとnot nullにできる
2:limitカラムの最大長
3:defaultカラムのデフォルト値を指定する

記述例

add_column( :books, :author_name, :string, :limit => 40)
add_column( :books, :category_code, :integer, :default => 1, :null => false)

外部参照

次のファイルを lib/migration_helpers.rb として置きます。
module MigrationHelpers
  def foreign_key(from_table, from_column, to_table)
    constraint_name = "fk_#{from_table}_#{to_table}"
    
    execute "alter table #{from_table} add constraint #{constraint_name} foreign key (#{from_column}) references #{to_table}(id)"
  end
end
これで、DB上の外部参照制約をメソッドとして使えるようになります。
メソッド名意味
foreign_key(from_table, from_column, to_table)参照キーを追加する

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人/副管理人のみ編集できます