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?

More than 3 years have passed since last update.

【Rails】 本番環境でのエラー(ActiveRecord::StatementInvalid (SQLite3::SQLException: no such table:inquiries)

Last updated at Posted at 2021-02-24

はじめに

普段開発する際は、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」このようなテーブルはない、と怒られています。

terminal.
〜本番環境(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すると不要な情報まで保存されてしまうので、どうしようかと悩みます。

db/schema.rb
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のブランチから削除しようか」という事になります。
テーブルを削除した事により、以下のファイルが作成されます。

db/migrate/20210130102257_inquiry.rb
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」このようなテーブルはない、と怒られています。

terminal.
[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

####以上で、エラー解決!!!

終わり

今回は以上になります。
作業を一からやり直す、戻ったブランチ先で前のブランチの情報を反映させてしまう、作成したテーブルを作業していたブランチで削除したくない、まずこのような方はなかなかいないと思います。
当然ですが、類似する記事もあまり見つからず苦戦しましたので、記録として残すことにしました。
私自身もプログラミング初心者ですが、同じ様な立場の方に少しでも参考になれば幸いです。
また、もし内容に誤りなどがございましたら、ご指摘いただけますと幸いです。

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?