はじめに
やあ。初投稿です。安彦と申します。
アウトプットの一環でQiitaを始めることにしました。
簡単な自己紹介をしますと,
エンジニア歴0年。
。。。つまり少々大きいエンジニアの赤ちゃんです。新卒で飲食業の某社にて2年働いていましたが,大学時代から興味のあったプログラミングへの炎が燃え上がりましてに,エンジニア業界への転職を志しました。
退職して思うことはいま一番生気溢れてます。自分がいなくても会社は回ります。同僚に「いまここやめたら店が壊れるからやめられない」と言ってた人がいます。この場を借りて言わせていただくと,**そんなことありません,そこに介入しない会社に原因がある。自分の人生を会社に隷属して無駄にして,さらに掛け替えのない20代を思うように使えない方がよっぽどあなたらしくなれない。**自身を磨いた結果,会社も盛り上がる,そっちの方がより自分らしくなれると思いませんか。
そんな訳でエンジニアとして生きていくため,今年二月中旬より自己投資としててっくきゃんぷ72期に参加させていただいております。執筆している現在,就職活動中です。てっくきゃんぷのことで聞きたい方,メッセージを頂ければ機密事項を侵さない程度に回答します。
ここの用い方としては日々の学びのアウトプット,備忘録として用いていきたいなと思います。日常生活に関してはtwitterで更新しています。自身の発信により,同じ悩みを抱えていた人が1分でも早く悩みを突破できる記事をコンセプトに頑張っていきます。ただし,一次ソースでないことは重々承知を。
本題 自動デプロイ時にmysqlのエラーが発生する(Rails)
さて今回触れるのは
「Mysql2::Error: Table 'aaaa' already exists」
原因
本番環境にすでにデプロイしている状態でローカル環境でDBをいじったため,本番環境と齟齬が生じマイグレーションできなかった?
アクション
本番環境のmysql内のDB再構成
mySQLコマンド参考記事
実際のエラーをみてみましょう
環境 AWS,unicorn,nginx,mysqlなどインフラ環境は割愛します。
rails 5.2.3
ruby 2.5.1
ローカルサーバー
bundle exec cap production deploy
を打った際に順調に進んでいたけど、、、
deploy:migrate
[deploy:migrate] Run `rake db:migrate`
00:26 deploy:migrating
01 $HOME/.rbenv/bin/rbenv exec bundle exec rake db:migrate
01 == 20200407054248 CreateGoods: migrating ======================================
01 -- create_table(:goods)
01 rake aborted!
01 StandardError: An error has occurred, all later migrations canceled:
01
01 Mysql2::Error: Table 'goods' already exists: CREATE TABLE `goods` (`id` bigint NOT NULL AUTO_...
01 FOREIGN KEY (`buyer_id`)
01 REFERENCES `users` (`id`)
01 , CONSTRAINT `fk_rails_87238b6105`
01 FOREIGN KEY (`seller_id`)
01 REFERENCES `users` (`id`)
01 )
01 /var/www/freemarket_sample_72g/shared/bundle/ruby/2.5.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:…
01 /var/www/freemarket_sample_72g/shared/bundle/ruby/2.5.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:…
oh,,,(´・ω・`)
goodsテーブルがすでに存在しているのでマイグレートできませんとのこと。
テスト環境ではrailsでdb:drop,db:create,db:migrateみたいに一回消して作り直せばいける気がしますが、、
、、、本番環境でもできるかなw
さて,本番環境のデータベースの破壊と再生成を行いましょう()
サーバーからmysqlに入ります
mysql -u root -p
データベースの確認を行います
show databases;
以下の箱が出てくると思います
+----------------------------------+
| Database |
+----------------------------------+
| information_schema |
| productionX |
| mysql |
| performance_schema |
+----------------------------------+
4 rows in set (0.00 sec)
データベースの名前がわかったので削除します。
drop database`productionX`;
これで削除が完了しました!
これでデプロイできるかな!!!
ActiveRecord::NoDatabaseError: Unknown database
oh,,,(´・ω・`)
いくら自動デプロイとはいえDBの生成は自動でやってくれませんね。
ではDB作成をしていきます.mysql内のDB生成は上の参考記事をみてください(一次ソースでない)
サーバー上から作っていけるみたいです。つまり,DB削除もできるのかも。
AWSサーバーにインして自分のアプリケーションのフォルダで
rails db:create RAILS_ENV=production
これでデプロイ時にmigrateされます。
もし初期値を用意したい場合はrails db:seed RAILS_ENV=productionを
カレントディレクトリで実行すればいけるみたい。
参考資料↓
https://qiita.com/Sotq_17/items/a091fe92dd64d3cf429b
こんな感じで頑張っていきたいのでよろしくお願いします!フィードバック随時受付中です!
twwiter