bin/rails db:resetについて [Ruby on Rails]

こんにちは!もとひろです。
今回はbin/rails db:resetをして結構困ったので、bin/rails db:resetについてまとめたいと思います。


bin/rails db:reset とは

bin/rails db:resetを実行すると、
DBが削除され、その後セットアップが実行されます。
つまりbin/rails db:resetは以下を順に実行するのと同じ意味になります。

  • DB削除:bin/rails db:drop

  • DBのセットアップ:bin/rails db:setup


bin/rails db:setupを詳しくみていきましょう。

bin/rails db:setup とは

bin/rails db:setupを実行すると
DBを作成し、スキーマファイルの読み込みとシードデータの読み込みを行います。
つまりbin/rails db:setupは以下を順に実行するのと同じ意味になります。

  • DB作成:bin/rails db:create

  • DBにスキーマファイルを読み込む:bin/rails schema:load

  • DBにシードデータを読み込む:bin/rails db:seed

bin/rails db:migrateはないですね。
マイグレーションファイルを変更していても、関係ないことが分かります。
以前のスキーマファイルからテーブルを作成しているからです。
食い違いが起こることもあるので注意してください。

bin/rails db:migrate:reset

DBを削除・作成し、その後マイグレーションしてほしいときには
bin/rails db:migrate:resetを実行します。
bin/rails db:migrate:resetは以下を順に実行するのと同じ意味になります。


補足:bin/rails db:migrate

bin/rails db:migrateマイグレーションすると同時に、
bin/rails db:schema:dumpも実行しています。

まとめ

bin/rails db:reset

以下が実行されています。

  • bin/rails db:drop

  • bin/rails db:create

  • bin/rails schema:load

  • bin/rails db:seed

bin/rails db:migrate:reset

以下が実行されています。

  • bin/rails db:drop

  • bin/rails db:create

  • bin/rails db:migrate

両者の違い

スキーマファイルからDBへ反映する」のか
マイグレーションファイルからDBへ反映する」のか

が違います。
あとシードデータが読み込まれるかどうかも違いますね。

おわりに

こうやってみてみると1つのコマンドで同時に複数のことが実行されているのがよく分かります。
bin/rails db:resetしてその後bin/rails db:migrateできない!というときは、
スキーマファイルから読み込んで作成されたテーブルとマイグレーションファイルがぶつかってる可能性があるので注意してみてください!
(私は複数回経験あります。苦笑)

おわりのおわりに

自学習中で1人で作業する際には、直接マイグレーションファイルを編集しても問題ありません。
共同作業者がいて開発をしている場合には、既存のマイグレーションファイルを直接書き換えて変更することはよくありません。
自分はもちろん、共同作業者も余計な作業が増えるからです。
そのような場合は、新しいマイグレーションファイルを作成しましょう。
Active Record マイグレーション - Railsガイド

参考リンク

Active Record Migrations — Ruby on Rails Guides
Active Record マイグレーション - Railsガイド



終わります👋