【こんな人に読んで欲しい】
チーム開発やってるけど、DB系コマンドが全然わからない。なんかマイグレーション系のエラーが起きる。どうなってるの?
【この記事を立ち上げた経緯】
ブランチを切ってチーム開発をしている時、(特に初期段階)、各自が各々のブランチでDBを作ってマイグレーションしてしまうので、
マイグレーションファイルやデータベース(テーブル)の状態がバラバラ。
そんな時にブランチを移動してしまうとエラーが起きる原因となります。それをどうやって修正するか?の記事です。かなりよく使うコマンドだと思うので、私もまだまだ勉強中ですが、少しでもご参考になれば幸いです。
後半に、本番環境のDBコマンドも載せてあります。
#### 【バージョンやら環境】 Rails 5.2.4.3 Ruby 2.5.1 macOS Catalina 10.15.4 AWS
【開発環境(ローカル)】
まずは、現在のマイグレーションファイルの状態から確認。
マイグレーションファイルがデータベース(テーブル)に適用されているかどうかを調べるコマンドです。
rails db:migrate:status
例えばこんな感じ
Migration IDとMigration Nameは、db/migrateの中のファイルとリンクしています。
■Status
・「up」 ▶︎ 適用されている
・「down」 ▶︎ 適用されていない(削除や修正が可能)
ちなみに、 ・「********** NO FILE **********」 と表示される場合があります。これは、マイグレーションファイル一回作ったことあるけど、いまはdb/migrate/ディレクトリの下に見当たらないよって場合に表示されるらしいです。
状態もわかったので、ロールバックします。
rails db:rollback STEP=X
ロールバック、とは「一度データベースからマイグレーションファイルを差し戻す」こと。
「X」には戻したいファイルの数を入れます。4つ戻したければ4。下のファイルからdownになっていきます。
ロールバックすることで、ファイルをupからdown(*****)の状態にします。
参考画像では6つファイルありますが、Xに4を入れましてすロールバックするとこんな感じ
全部 downになったので、再度マイグレーションしてテーブルを再作成していきます。
rails db:migrate
なれない時は都度rails db:migrate:statusで状態を確認してみるといいと思います!!
ちなみに、うまくいかない場合はrails db:migrate:resetという、リセットしてマイグレーションするコマンドもあります。
rails db:migrate:reset
どちらにしても、にローカルで保存していた画像やら登録したユーザーやらも消えてしまいますが・・・まあ、やむなしですね。
ちなみに、私の場合は、基本元のブランチで全てdownにしてから、作業するブランチに行ってrails db:migrateをしていました。
【参考までに本番環境】
なお、本番環境でのDBコマンドは下記の通りです。
(デプロイ担当者に捧げます、がんばれ)
rails db:migrate:status RAILS_ENV=production
RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:migrate:reset
※私は本番環境で上記の方法しか使ったことがないですが、他に方法があるんでしょうか?
rails db:migrate RAILS_ENV=production
rake db:seed RAILS_ENV=production
以上になります!!!
【一部参考にさせていただいたサイト】
Railsガイド Active Record マイグレーション
※ver6.0のページを見ています。
【あとがき】
うちのチームにはDB系のコマンドを交通整理してくれたDB担当メンバーがいるのですが、本当に感謝しかありません。おかげさまでうちのチームはマイグレーションパニックがほとんど起きませんでした。最終課題後少し(多分)
(この記事、大丈夫かな、役に立つかなってドキドキしてます・・・)