0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

テーブルの変更内容がRenderに反映しない時の対処方法

Posted at

使用しているツール・動作環境

・アプリケーション制作の主要言語: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を実行することになりましたが、正常に稼働したので良かったなと思っています:relaxed:

パターン1 Gemfile側Rakeのバージョンをそのまま使う

bundle exec rake db:drop

上記のコマンドを実行する
bundle execを利用することで、アプリケーション(つまり、自分のプロジェクトのGemfile)が指定したバージョンのgemを利用することができる

パターン2 Gemfile側のRakaのバージョンをアップデートする

bundle update rake

上記コマンドを実行する。
rake gemの新しいバージョンをインストールし、その後、Gemfile.lock ファイルが更新され、新しいバージョンへとリファレンスが更新される。
ただし、これにより他の依存関係に影響を及ぼす可能性があるため、更新前後でアプリケーションが正常に動作するか確認が必要。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?