Railsのmigrationを触るのは初めてだったので、勉強備忘録のために簡単に書きとどめてみる。
migrationについて
マイグレーションは、データベーススキーマの継続的な変更 を、統一的かつ簡単に行なうための便利な手法。
migrationファイルを作成する
サンプルとしてCompanyテーブルを準備
カラム名 | データ型 |
---|---|
id | integer |
name | string |
description | text |
created_at | datetime |
updated_at | datetime |
$ rails g migration CrateCompany
Active Recordにはマイグレーションの実行順序をファイル名のタイムスタンプでの表示を自動でやってくれる。
作成されたファイルはdb/migrate
ディレクトリに保存される。
作成されたファイル
class CrateCompany < ActiveRecord::Migration[5.2]
def change
end
end
ActiveRecord::Migration[]にはバージョンが入る。
chengeの代わりにupとdownを使うことができる。
upメソッドにはmigrationする時の内容、downメソッドにはrollbackする時の内容を書く。
class CrateCompany < ActiveRecord::Migration[5.2]
def up
end
def down
end
end
変更を加える
マイグレートファイルを作成しrails db:migrate
を打てば実行してくる。
また直前の変更を取り消すためにはrails db:rollback
テーブルを作成する
class CrateCompany < ActiveRecord::Migration[5.2]
def change
create_table :companies do |t|
t.string :name
t.text :description
t.timestamps
end
end
end
このコマンドを打てば自動で上記のようなもの作成してくれる
$ rails g migration CrateCompany name:string description:text
####テーブルを変更する
class ChangeTableCompany < ActiveRecord::Migration[5.2]
def change
change_table :companies do |t|
t.remove :name
t.string :root_number
t.index :root_number
t.rename :description, :description_note
end
end
end
上のマイグレーションではnameカラムが削除され、stringカラムであるroot_numberが作成されてインデックスがそこに追加されます。そして最後にdescriptionカラムをリネームしている。
####カラムを変更する
change_column :companies, :root_number, :text
モデル名のroot_number
のカラムをtext
に変更。
ここでの注意点だが、change_column
はchange
メソッドではロールバックすることができない。
change
メソッドではサポートさていないとのこと。
change
でサポートされているマイグレーション定義は
add_column
add_foreign_key
add_index
add_reference
add_timestamps
change_column_default (:fromと:toの指定は省略できない)
change_column_null
create_join_table
create_table
disable_extension
drop_join_table
drop_table (ブロックを渡さなければならない)
enable_extension
remove_column(型を指定しなければならない)
remove_foreign_key(2番目のテーブルを指定しなければならない)
remove_index
remove_reference
remove_timestamps
rename_column
rename_index
rename_table
もしロールバックする場合はup,downメソッドであればchange_column
を使用可能。
class ChangeColumnCompany < ActiveRecord::Migration[5.2]
def up
change_column :companies, :root_number, :text
end
def down
change_column :companies, :root_number, :string
end
end
まだまだmigrationについては知らないことばかりだが、身につけていきたい。