👨‍💻

《Rails》renderでの本番環境でのマイグレーションの注意【初学者のオリアプ作成】

2024/05/05に公開

こんにちは、ミヤビです(^^)

亀の歩みでオリアプ開発を毎日進めています。

初学者の自分からするとよくここまで作ったよ、というくらいには作ってるんですが目標まではまだまだ。
自分で企画したんですけど機能とページ多すぎなんよ、、、
マイルストーン(中間目標)を一つ達成したら改めてオリアプ紹介記事は書きます。

今回はそんなオリアプ作成の際のマイグレーションファイルのお話。

本番環境でデプロイする時にもマイグレーションは実行する

この表現が正しいか分かりませんが、今日言いたい話はこれです。
「本番環境でデプロイした時にマイグレーションを実行する」ということです。
ちなみにマイグレーションに関する記事を以前に書いています。
https://zenn.dev/d_miyabi/articles/9d0b88c547071a
この時にもちらっと触れていましたが、改めて自分もよく理解していない部分あったな〜、と気づいたので補足的に書きます。
現在の自分はRenderというサービスの無料枠でアプリをデプロイしているので、Renderが前提の話です。
近々AWSにお引越しする予定ですのでその時はその時でまた話します。
今回僕はローカル環境ではマイグレーションファイルを修正する際には毎回rollbackして修正してから再度マイグレーションを実行する、という形で修正していました。
これはこれで大事なことです。
始めの頃の僕はrollbackしないで修正とかしていました。
で、今回本番環境でデプロイはうまくいっていたものの、実装したマイページが上手く表示されないエラーに遭遇しました。
エラー画面を撮ってなかったので文字で説明が続きます。
シンプルにローカル環境でマイグレーションは変えたけど、本番環境では変わってないよ、というお話でした。
何かいつの間にか混乱するんですが、ローカルでどれだけマイグレーションを修正しても、一度デプロイ舌本番環境のマイグレーションは修正されないんですよね。
どう解決したのか?続きます。

Renderのデータベースをリセットする

やったことをとりあえずつらつらと書きます。
単純に本番環境Renderのデータベースをリセットしてマイグレーションを実行し直しました。

bin/render-build.sh
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate

アプリにこういうディレクトリがあると思うので、こちらを一旦修正します。

bin/render-build.sh
!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
# bundle exec rake db:migrate
DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:migrate:reset

bundle exec rake db:migrate
を削除して、
DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:migrate:reset
を記述します。
このコマンドはデータベースをリセットするコマンドです。

この3つを同時に実行している、の意味となります。
この記述をしてGitHubでプッシュしてデプロイし直します。
ちなみにあるあるの様な注意点ですが、TablePlusで該当のデータベースを開いているとリセットできないので一旦TablePlusを開いている場合は停止しましょう。

上記の作業が無事に終わり、本番環境での動作を確認します。
この時にはTablePlusを起動しなおしてカラムとかを確認すればいいかな、と思います。
これで本番環境でもマイグレーションが修正されました。

終わった後は記述を元に戻しておく

無事に本番環境の修正が終わったら先程の記述は元に戻しておきます。

bin/render-build.sh
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate

これが元の状態ですね。
これを戻しておかないと、毎回本番環境のデータベースがリセットされてしまいます。
個人で開発している分にはそれでも影響は大きくないかもしれませんが、例えばユーザー管理機能を実装している場合、登録したアカウントも毎回消えるので毎回新規登録をすることになります。
そもそもこの方法は複数のユーザーに何かデータを登録してもらっている場合は全部消えてしまうので、アプリの進捗状況でデータベースから消えたら困るデータがある場合にはちょっと難しいかもしれないですね。
感覚的に個人のオリアプ開発ではその状況はあまりなさそうかな、とは思っています。

志ある仲間も同じこと書いてた

余談ですが、同じスクールテックキャンプの仲間も同じような内容を書いていました。
志の高い素敵な仲間です(^^)
僕より分かりやすく書いていらっしゃるのでこちらも参考にどうぞ。

https://taro-poyota.hatenablog.com/entry/2024/05/03/122745

同じエラーでも遭遇する場面は人それぞれですし、表現も人それぞれなので色々見ることで知識の深化定着になりますね。

僕は難しいことを分かりやすく説明することが割と得意と自負していますが、プログラミングの領域はまだまだそこまで達していないので愚直に学習を継続したいと思います。

人に説明するにも自分が理解してないと難しいですよね。

近日中にオリアプをAWSに引っ越ししてまた記事を書こうと思います。

何かを学んでいるあなたは素晴らしいです!

より良い人生にしていきましょう♪

Discussion