はじめに
普段開発する際は、cloud9を使用しており、今回はAWSでデプロイをしたときの話になります。
本番環境の構築も既に済んでおり、git pullにて最新の情報を反映させようとしていました。
ところが、マイグレートを実行しようとしたところ、そんなテーブルはないと怒られてしまったのです。
開発環境
ruby 2.6.3
Rails 5.2.4.4
本番環境
AWS EC2
エラーが起こるまで
〜本番環境EC2上〜
①git pull origin master
②bundle exec rails db:migrate RAILS_ENV=production
⇩ エラーが発生する
####ActiveRecord::StatementInvalid (SQLite3::SQLException: no such table:inquiries
#####※ 「inquiries」このようなテーブルはない、と怒られています。
〜本番環境(EC2)〜
$ git pull origin master
$ bundle exec rails db:migrate RAILS_ENV=production
ActiveRecord::StatementInvalid (SQLite3::SQLException: no such table:inquiries
エラーが起こるまで
①開発環境にて、developブランチから更にブランチを分けて作業をしていました。
その際、分けたブランチ先でinquiriesというテーブルを作成していました。ところが、幾時間かかけ作業をしていたものの上手くいかず、一からやり直そうという発想に至るわけです。
ブランチを分けているから大丈夫!と当時の私は思いました。
②developブランチに戻ります。
問題はここからです。developブランチに戻った際に、前のブランチで開いていたファイルに対して、「Reload」「Keep Current Version」のように問われることがあるかと思います。この問いに対して、「Keep Current Version」を押したのでしょう。
せっかくブランチ分けていたのに、ここでの過ちによりschema.rbにinquiriesテーブルが残ってしまいます。
③schema.rbからinquiriesテーブルを消したい!
ただ、先ほど作業していたブランチ自体は不要で、そのブランチでinquiriesテーブルの削除を行い、git pushすると不要な情報まで保存されてしまうので、どうしようかと悩みます。
ActiveRecord::Schema.define(version: 2021_02_17_102543) do
# このテーブルを削除したい
create_table "inquiries", force: :cascade do |t|
t.string "name", null: false
t.string "email", null: false
t.string "title", null: false
t.text "content", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
④ここでメンターさんに相談をしました。
「なるほど。schema.rbからテーブルを削除したいんだね。それじゃ、developのブランチから削除しようか」という事になります。
テーブルを削除した事により、以下のファイルが作成されます。
class Inquiry < ActiveRecord::Migration[5.2]
def change
drop_table :inquiries
end
end
⑤問題が解決したので、不要なブランチの削除を行い、再度別ブランチで作業を始めました。
新しいブランチでの作業は問題なく進み、git pushを行い本番環境にも反映させようとしたのです。
〜本番環境EC2上〜
①git pull origin master
②bundle exec rails db:migrate RAILS_ENV=production
⇩ エラーが発生する
####ActiveRecord::StatementInvalid (SQLite3::SQLException: no such table:inquiries
#####※ 「inquiries」このようなテーブルはない、と怒られています。
[ec2-user@ipアドレス/(アプリ名) ~]$ git pull origin master
[ec2-user@ipアドレス/(アプリ名) ~]$ bundle exec rails db:migrate RAILS_ENV=production
ActiveRecord::StatementInvalid (SQLite3::SQLException: no such table:inquiries
エラーの原因
#####テーブルが削除されたマイグレーションファイルは存在しているのに、テーブルが作成されたマイグレーションファイルが存在しないため(別ブランチで作成後pushしていないため)
解決方法
ここでまた途方に暮れたので、メンターさんにご相談させていただきました。
まず、エラーが起こるまでの④で作成された、こちらのファイルを(db/migrate/20210130102257_inquiry.rb)右クリックで削除する。
※今回の私の場合は、一から作成し直しているので本当に不要なファイルだった為削除致しております。
安易に削除されるのは、良いことではないです。
〜開発環境(cloud9)〜
# 既にGitHub上に反映させてしまっていたので、GitHub上からも削除します。
$ git rm (ファイル名)
# 変更を加えたので、再度pushし直します。
$ git add .
$ git commit -m "(コミットメッセージ)"
$ git push origin develop
〜GitHub〜
プルリクエストを送り、developからmasterへmergeさせる。
〜本番環境(EC2)〜
$ git pull origin master
$ RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rails db:drop
$ rails db:create RAILS_ENV=production
$ bundle exec rails db:migrate RAILS_ENV=production
####以上で、エラー解決!!!
終わり
今回は以上になります。
作業を一からやり直す、戻ったブランチ先で前のブランチの情報を反映させてしまう、作成したテーブルを作業していたブランチで削除したくない、まずこのような方はなかなかいないと思います。
当然ですが、類似する記事もあまり見つからず苦戦しましたので、記録として残すことにしました。
私自身もプログラミング初心者ですが、同じ様な立場の方に少しでも参考になれば幸いです。
また、もし内容に誤りなどがございましたら、ご指摘いただけますと幸いです。