Railsにおけるmigrationを使ったテーブル定義の変更方法は、Qiitaを筆頭に、ちょっとググればすぐ出てきます。大変ありがたいのですが、一向にmigrationファイルの書き方を覚えられないし、毎回ググるのも面倒になってきたので、「自分のブログを見れば全部わかる」状態を目指して、まとめることにしました。
まとめといっても、実際に自分が使ったことのあるものだけを記載しています。随時更新していきます。
既存テーブルに対する変更
カラムを追加する
ファイル生成コマンドrails g migration AddColumnTo[クラス名] [カラム名]:[データ型]
※追加するカラムはスペース区切りで複数指定可
# migrationファイル def change # add_column :対象テーブル名, :対象カラム名, :型 add_column :users, :age, :integer end
カラム名を変更する
ファイル生成コマンドrails g migration Rename[変更前のカラム名]ColumnTo[変更後のカラム名]
# migrationファイル def change # rename_column :[対象テーブル名], :[変更前のカラム名], :[変更後のカラム名] rename_column :users, :uid, :user_id end
カラムのデータ型を変更する
ファイル生成コマンドrails g migration ChangeDatatype[カラム名]Of[テーブル名]
# migrationファイル def change # change_column :対象テーブル名, :対象カラム名, :変更後のデータ型 change_column :users, :name, :string end
※ただし、PostgreSQLでintegerやboolean型に変更するとPG::DatatypeMismatch: ERROR
というエラーが起きる場合があります。change_column
メソッドを以下のようにすると解消します。
change_column :users, :age, 'integer USING CAST(age AS integer)'
カラムにオプションを設定する
デフォルト値
ファイル生成コマンドrails g migration AddDefalutValue[カラム名]Of[テーブル名]
# migrationファイル def change # change_column :対象テーブル名, :対象カラム名, :型, default: デフォルト値 change_column :users, :age, :integer, default: 20 end
外部キー制約
ファイル生成コマンドrails g migration AddForeignKeyTo[テーブル名] [カラム名]:references
# migrationファイル def change # add_reference :対象テーブル名, :対象カラム名, foreign_key: true add_reference :users, :club, foreign_key: true end
NOT NULL制約
ファイル生成コマンドrails g migration Change[カラム名]Of[テーブル名]
※false
をtrue
とすれば制約を外すことができる。
# migrationファイル def change # change_column_null :対象テーブル名, :対象カラム名, false change_column_null ::users, :user_id, false end