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つのコマンドを実行してくれる
- $ rails db:create
- $ rails db:schema:load
- $ rails db:seed
余談(現場での運用)
現場では開発者が複数人いるので、テーブルに変更を加える際は、既存のマイグレーションファイルに変更を加えないようにするのが鉄則です。
【理由】
既存のマイグレーションファイルに変更を加えると、共同開発などをしている際に、共同開発しているメンバーも$ rails db:migrate:reset
しないといけなくなる
【ベストプラクティス】
新しいマイグレーションファイルを作成し、テーブルに変更を加える
このような対応をすると、共同開発しているメンバーは$ rails db:migrate
するだけで良くなります!
ただ、開発環境なら共同開発してるメンバーに$ rails db:migrate:reset
してくださいと周知すれば済むので、その対応でも良いですが、本番環境で$ rails db:migrate:reset
や$ rails db:reset
をすると、DBの値が全部吹き飛び、大事故になるため、ご注意を。