起こったこと
プログラミングスクールの最終課題で某フリマアプリのコピーサイトをチームで作っています。
チームメンバーがマージしたものをデプロイした際にこんなエラーが発生しました
Mysql2::Error: Duplicate column name 'image_id': ALTER TABLE `items` ADD `image_id` int NOT NULL AFTER `category_id`
まず、このエラー文が何かを調べることにしました。
先ほどのエラー内容は
「カラムが重複してるから、そんなことできません!」って意味になります。
すでに出来上がっているカラムをさらに追加しようとしたことが原因みたいです。
ふーん原因はわかったぞ
でも念のために本番環境でもエラーを見ておこう
ここからが地獄の始まりでした。
地獄の始まり
本番環境でエラーを見るために
Less log/unicorn.stderr.log
を実行するとこんな文章が
ERROR -- : Unknown database 'データベース名' (ActiveRecord::NoDatabaseError)
###・・・はぁ!?
そんなわけない、今までデプロイできてたじゃん!
焦って、mysqlのデータベースが存在しているか確認
mysql -u root -p #データベースの立ち上げ
# パスワード認証が出るので設定したパスワードを入力。入れたら以下を記述
show databases;
# 存在するデータベースが表示される
確認するとデータベースは存在している、しかしエラーがわからないな。
怖いから、サーバーを再起動して、データベースのリセットを試みました。
# リセットのためのコマンド
RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop
# エラー文として表示されたもの
Access denied for user ''@'localhost' to database 'データベース名'
アクセスが拒否された・・・?
なんでだー!
ここで私はデータベースを削除する決心を固めました。
もう一度本番環境でmysqlにアクセスし
drop database データベース名;
を実行
マイグレーションファイルもできてるし、もう一度createしてからmigrateを実行すればどうにかなる!
まだ続くよ!
# テーブルを作成するコマンド
rails db:create RAILS_ENV=production
# エラー文
Mysql2::Error::ConnectionError: Access denied for user ''@'localhost' to database 'テーブル名': CREATE DATABASE `テーブル名` DEFAULT CHARACTER SET `utf8`
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"テーブル名", "password"=>nil, "socket"=>"/var/lib/mysql/mysql.sock", "database"=>"テーブル名"}
###ならなかったよぉ!
パスワードはnil
だし、Access denied for user ''@'localhost'
ってrootが空白になってるし!
そうだ、database.yml
を確認しよう、設定ミスかもしれない!
production:
<<: *default
database: データベース名
username: root
password: <%= ENV['DATABASE_PASSWORD'] %>
socket: /var/lib/mysql/mysql.sock
記述はあっている。どこを間違えたのだろうか。。。
明かされる衝撃の事実!
色々と調べるうちになーんだ、そんなことかよ!って気づきました。
本番環境で作業するディレクトリを間違えていました。
currentディレクトリで実行する
これがデータベースにアクセスできない、作成できないの原因でした。
``本番環境で初回デプロイ実行後、currentフォルダ内のデータが本番環境で動いているフォルダ群となるようです!```
私は、アプリ名のディレクトリで今までcreateを実行しようとしていたので、そんなもの見つからねぇよ!と弾かれていたのです。
なのでcurrentディレクトリに移動し
rails db:create RAILS_ENV=production
を実行!
###データベースができた!
rails db:migrate RAILS_ENV=production
を実行!
###テーブルが反映された!
ローカルでbundle exec cap production deploy
を実行!
###デプロイできたよ!
これで一安心してはいけません。
seed.rbの反映するのを忘れるところでした。
本番環境でrake db:seed RAILS_ENV=production
を実行、その後アクセス。
ちゃんとページが表示されました。
#結論