最終更新: celestianglobe 2010年11月03日(水) 19:38:02履歴
DBスキーマの定義をRailsで管理する際の差分(変更)を定義するための仕組みがマイグレーション。
あるプロジェクトで次のようにDB更新があったとする。
実際は複数テーブルが入れ子担って更新されるが、今回は偶然productテーブルだけに変更があったとする。
コマンドを実行すると、テーブルを変更するためのファイル(マイグレーションファイル)が生成されるので、希望にそって変更しておく必要がある。マイグレーションファイルは差分ファイルの為、テーブル定義がどのように変更されるかを記述する。
最新に変更する場合は何も考えず、このページの一番上のコマンドを実行する。
しかし、実行順序3の実行後に変更するように途中まで実行する場合は次のコマンドを実行する。
現在のバージョンを取得するには次のコマンドを実行する。
実際は複数テーブルが入れ子担って更新されるが、今回は偶然productテーブルだけに変更があったとする。
実行順序 | 実行内容 | 実行コマンド | 備考 |
1 | productテーブルを追加する | rails g migration CreateProducts | 通常はmodelかscaffoldを使用する |
2 | productテーブルに"Kana"列を追加する | rails g migration AddKanaToProducts kana:string | |
3 | productテーブルから"Kana"列を削除する | rails g migration RemoveKanaFromProducts | マイグレーションファイルに付く日付を20080906120000とする。 |
4 | productテーブルを削除する | 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
メソッド名 | 意味 | |
1 | create_table(name, options) | テーブルを作成する |
2 | drop_table(name) | テーブルを削除する |
3 | rename_table | テーブル名を変更する |
4 | add_column(table_name, column_name, type, options) | カラムを追加する |
5 | remove_column(table_name, column_name) | カラムを削除する |
6 | rename_column | カラム名を変更する |
7 | execute | SQLを実行する |
8 | add_index(table_name, column_names, index_type, index_name) | インデックスを追加する |
9 | remove_index(table_name, index_name) | インデックスを削除する |
型名 | 意味 | |
1 | string | 文字列 |
2 | text | 長い文字列 |
3 | integer | 整数 |
4 | float | 浮動小数 |
5 | decimal | 固定長整数 |
6 | datetime | 日時 |
7 | timestamp | タイムスタンプ |
8 | time | 時刻 |
9 | date | 日付 |
10 | binary | バイナリ |
11 | boolean | 真偽値 |
add_column( :books, :author_name, :string, :limit => 40)
add_column( :books, :category_code, :integer, :default => 1, :null => false)
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) | 参照キーを追加する |
コメントをかく