使用しているツール・動作環境
・アプリケーション制作の主要言語:Ruby
・本番環境のデータベース:TablePlus
・本番環境:Render
テーブルの変更内容がRenderに反映されない原因
マイグレーションファイルの作成が正しく行われていない場合、
Renderで作成したテーブルの構成を変更できないことがあるようです。
以下の条件に当てはまる場合の対処法の共有です。
確認事項
カラムの変更などのテーブル変更を行なった
ローカルでは変更内容が正しく反映する
Renderでデプロイを行なった際、エラーは出ないがテーブルに変更内容が反映されない
Renderで作成したデータベースをリセットする
警告
以下作業を行うと、過去の投稿データすべてが削除されます。
それでも問題がない場合は実行OKです
1. デプロイ時に自動で実行される処理内容を変更する
8行目をコメントアウトし、9行目(データベースをリセットするために必要な記述)を追記。
#!/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
とは
bundle exec rake db:migrateというコマンドは、Railsのフレームワークで用いられるコマンドで、アプリケーションのデータベーススキーマを更新するためのもの。
DISABLE_DATABASE_ENVIRONMENT_CHECK=1
とは
本番環境のデータベースを削除するために必要な設定。
本番用のデータベースは重要な情報が含まれるので、普段は削除できないようになっているが、
今回はリセットをしたいので、削除を許可する設定を記述。
bundle exec rake db:migrate:reset
とは
データをリセットするためのコマンド。
以下の三つのコマンドを順番に実行する動作をする。
・rake db:drop(データベースの削除)
・rake db:create(データベースの作成)
・rake db:migrate(マイグレーションファイルの実行)
2. TablePlusを開いている場合は終了する
これからリセットを実行するので、データベースをTablePlusで開いている場合削除できないから
3. GitHubにプッシュ
コードの変更内容をプッシュして更新する。
プッシュすると、Renderのデプロイが実行される。
4. 動作確認を行う
本番環境で操作したり、TablePlusのテーブル内容が反映されているか確認する。
5. 設定を元に戻す
手順1で追記したコードにより、現状だとデプロイのたびにデータベースをリセットする設定
になってしまっているので設定を初期値に戻す。
#!/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
以上です。
なんとかデータベースをクリアして、正常にテーブルの変更内容を本番環境のデータベース側に反映させることができました。
以下、ちょっとした失敗談。
私の場合、手順1
をした上で、データベースリセット
のための3つのコマンド
を実行しました。
コマンドを一つずつ実行す手間を省くための手順1
の記述でしたが、気づけば
自らコマンドを打ち込んでおりました。
自分の手間が増えるだけで、作業には問題はないはず。
指を鍛える運動だ!!と思って前向きに捉えていたのですが、
その際、出現したエラーがこちら
% rake db:drop
rake aborted!
Gem::LoadError: You have already activated rake 13.2.1, but your Gemfile requires rake 13.2.0. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
<internal:/Users/riko/.rbenv/versions/3.2.0/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
<internal:/Users/riko/.rbenv/versions/3.2.0/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
/Users/riko/projects/presentbox/config/boot.rb:3:in `<top (required)>'
/Users/riko/projects/presentbox/config/application.rb:1:in `require_relative'
/Users/riko/projects/presentbox/config/application.rb:1:in `<top (required)>'
/Users/riko/projects/presentbox/Rakefile:4:in `require_relative'
/Users/riko/projects/presentbox/Rakefile:4:in `<top (required)>'
/Users/riko/.local/share/gem/ruby/3.2.0/gems/rake-13.2.1/exe/rake:27:in `<top (required)>'
(See full trace by running task with --trace)
調べてみると、システムはrake 13.2.1を有効化していますが、Gemfileではrake 13.2.0を要求している
ということのようです。
システムで有効化しているバージョンとGemfileで要求しているrakaのバージョンが一致していないことによるエラーでした。
対処方法は確認すると2パターンあり、
パターン1
を試して、それでもうまくいかない場合はパターン2
を試してみることがよさそうです。
結果として、パターン2
を実行することになりましたが、正常に稼働したので良かったなと思っています
パターン1 Gemfile側Rakeのバージョンをそのまま使う
bundle exec rake db:drop
上記のコマンドを実行
する
bundle execを利用することで、アプリケーション(つまり、自分のプロジェクトのGemfile)が指定したバージョンのgemを利用することができる
パターン2 Gemfile側のRakaのバージョンをアップデートする
bundle update rake
上記コマンドを実行
する。
rake gemの新しいバージョンをインストールし、その後、Gemfile.lock ファイルが更新され、新しいバージョンへとリファレンスが更新される。
ただし、これにより他の依存関係に影響を及ぼす可能性があるため、更新前後でアプリケーションが正常に動作するか確認が必要。