rails db:reset、rails db:migrate:reset、rails db:setupの違い


rails db:reset、rails db:migrate:reset、rails db:setupの違いをたまにどれがどれだったか忘れるので、まとめておきます。

rails db:reset

  • rails db:reset の場合は、新しくテーブルを作り直して、さらにシードファイルも読み込んでダミーデータも作ってくれる。新しくテーブルを作り直すので、既存のデータは全て消えて新たにシードファイルを元に作り直す。
Dropped database 'hogehoge_development'
Dropped database 'hogehoge_test'
Created database 'hogehoge_development'
Created database 'hogehoge_test'
  • rails db:reset はマイグレーションファイルを編集しても、その内容は反映されない。マイグレーションを実行しない。スキーマファイル ( db/schema.rb ) だけを利用する。

rails db:migrate:reset

  • 新たにテーブルを作り直すので、テーブルのデータはもちろん全部消える。※ここは、$ rails db:resetと同じ
Dropped database 'hogehoge_development'
Dropped database 'hogehoge_test'
Created database 'hogehoge_development'
Created database 'hogehoge_test'
  • db/migrate/hoge.rbの、マイグレーションも実行。DB をdrop した後、通常通りのマイグレート(db:migrate)が行われる。つまり、db/migrate/hoge.rb が古い順から全て実行される。

  • シードファイルは読み込まないので、新しいダミーデータは生成されない。($ raild db:seedは自分で実行する必要がある)

rails db:setup

  • アプリケーションのDB周りの初期設定をしてくれる。以下3つのコマンドを実行してくれる
  1. $ rails db:create
  2. $ rails db:schema:load
  3. $ rails db:seed

余談(現場での運用)

現場では開発者が複数人いるので、テーブルに変更を加える際は、既存のマイグレーションファイルに変更を加えないようにするのが鉄則です。

【理由】
既存のマイグレーションファイルに変更を加えると、共同開発などをしている際に、共同開発しているメンバーも$ rails db:migrate:reset しないといけなくなる

【ベストプラクティス】
新しいマイグレーションファイルを作成し、テーブルに変更を加える

このような対応をすると、共同開発しているメンバーは$ rails db:migrate するだけで良くなります!
ただ、開発環境なら共同開発してるメンバーに$ rails db:migrate:reset してくださいと周知すれば済むので、その対応でも良いですが、本番環境で$ rails db:migrate:reset$ rails db:resetをすると、DBの値が全部吹き飛び、大事故になるため、ご注意を。