🎈

【Rails】データベースのテーブル、カラムの変更手順

2022/05/18に公開

本題に入る前に

概要

基本的に、

$ rails migration hogehoge

でマイグレーションファイルの作成、
マイグレーションファイルの編集後、

$ rails db:migrate

の流れで適用できる。
マイグレーションファイル作成コマンドを適切に入力すれば、
マイグレーションファイルの編集の必要はなくなる。

rollbackは?

Rollbackはあまりしない方がいい。
個人開発であれば問題ない場合もあるが、チーム開発の場合コードに辻褄が合わなくなることがある。

テーブル、カラムの状態を確認

db/schema.rbに記載されている。

テーブル名、カラム名、データ型の内容が記載されている。

本題

カラム関連

カラムを追加したい時

【例】reviewsテーブルにinteger型のuser_idカラムを追加したい時

$ rails g migration AddUser_idToReviews user_id:integer

$ rails db:migrate

$ rails db:migrate

カラム名を変更したい時

$ rails g migration rename_変更したいカラム名_column_to_テーブル名


エディターで生成されたファイルを編集
ename_column テーブル名, 変更前のカラム名, 変更後のカラム名

class RenameJobNameColumnToJobs < ActiveRecord::Migration[6.0]
  def change
	    rename_column :jobs, :job_name, :name
  end
end

$ rails db:migrate

カラムのデータ型を変更したい時

【例】reviewsテーブルのjob_idのデータ型をintegerからbigintに変更

$ rails g migration ChangeDatatypeJob_idOfReviews


生成したマイグレーションファイルを編集
change_column :テーブル名, :変更するカラム名, :変更するデータ型

db/migrate/〇〇_change_datatype_job_id_of_reviews.rb

class ChangeDatatypeJobIdOfReviews < ActiveRecord::Migration[6.0]
  def change
    change_column :reviews, :job_id, :bigint
  end
end

$ rails db:migrate

カラムを削除したい時

rails g migration Removeカラム名From削除元テーブル名 削除するカラム名:データ型
例 Jobsテーブルのuser_idカラムを削除したい時

$ rails g migration RemoveUser_idFromJobs user_id:integer

$ rails db:migrate

テーブル関連

テーブルを削除したい時

【例】usersテーブルを削除したい時

$ rails g migration users


マイグレーションファイル編集
db/migrate/〇〇_users.rb

class Users < ActiveRecord::Migration[6.0]
  def change
    drop_table :users
  end
end

$ rails db:migrate

テーブル名を変更したい時

テーブル名を修正した後、
モデル、コントローラーも修正が必要。こちらの記事が参考になります。
https://qiita.com/mtoyopet/items/a8558c9b7010dde6ecf8

マイグレーションファイルを削除したい時

【例】画像の赤線のマイグレーションファイルを消す

マイグレーションの状態を確認。

$ rails db:migrate:status


消したいマイグレーションファイルのバージョンを指定

$ rails db:migrate:down VERSION=20220517081311


Down状態になったか確認後、

$ rm db/migrate/20220517081311add_devise_to_accounts.rb(消したいマイグレーションファイル名)

以上です。
間違いがあればご指摘いただけますと幸いです。

参考:https://qiita.com/s_tatsuki/items/3e1f119c91e21b8f0c33

Discussion