DBエラー解決！！　〜Deploy環境のmigrationの修正〜

# はじめに
### 注意事項
本記事において、起こったトラブルに関して、筆者Ikuyは一切の責任をおいませんので、ご了承ください
また、下記を読み進められた場合は、上記注意事項を了解したものとします
各自テストデータ等を使用して、DBの理解を深めるための参考程度にされるといいかと思います

# エラーのお話
＊各項目に番号を振っています
そのエラー解決の詳細はお話の後にまとめます
私＝デプロイ担当
DB=mysql

チーム開発時のエラー
アプリは完成間近でしたが、各自のDBの状況がバラバラで、カラムのエラーが出ていました
チームメンバーの一人がmasterからPullしたデータには
RemoveCategoryFromItems
のファイルがありました（ItemsTableのcategoryカラムは不要なカラム）
しかし彼のDBにはそもそもItemsTableにcategoryカラムはありません
###**①そこで、RemoveCategoryFromItemsのmigrationファイルよりも前にAddCategoryToItemsを作成**し、作る=>消すという流れにすることでことなきを得ました
しかし、私は彼に「そのブランチは死にブランチ（今回のDBのカラム調整のためだけのブランチ）にして、新たにブランチを切って」と言いませんでした

…ここで言わなかったことがのちに大きな問題となったのです

私は彼のPullRequestをmargeし、デプロイしました
さて、localで残りの作業を、と思ったその時あることに気がつきました

**私のLocalDBのItemsTableにcategoryカラムが復活していたのです！！**
まさかと思い、デプロイ環境でのDBを確認すると…
**categoryカラムが鎮座しておりました！！**

絶望に満ちながらいろんな仮説を立てて
###**②SeqelProを駆使して両方のcategoryカラムを葬り去ることができました**

めでたしめでたし


# 解説
しょうもない話を読んでくれてありがとうございました
順番に解説します

## ①migrationファイルの日時を変更する
前提知識：migrationファイルの基本は日付の若い順に処理がなされる

migrationファイルには長ったらしい名前がついています
例：20191219104345_remove_price_from_posts.rb　←Aとします
手前の数字が作成日時で、add以降が何をしているファイルかということが書いています。
今、上記のファイルがすでにあったとして以下を実行すると、

```
$ rails generate migration AddPriceToPosts
Running via Spring preloader in process 11435
      invoke  active_record
      create    db/migrate/20191219104555_add_price_to_posts.rb #←Bとします

```

現在日時のmigrationファイルが作成されます
①の問題を解決するには、down状態のそのファイルを削除するか、migrationファイルを、問題のmigrationファイルより前に差し込む必要があります。
今回はなぜか、その問題のmigrationファイルを通したかったので、Bのファイル名の日付部分を20191218~~に変更しました
そうすることで、Aのファイルよりも前にBのファイルが読み込まれるので、カラムを作成した後に削除することができました

## ②デプロイ環境のmigrationを修正する
こいつが厄介でした
なんせデプロイ環境ですからね、それに完成間近でしたし
今回のエラーは特殊（？）でremoveのmigrationファイルがUP状態（通っている）なのに、カラムが消えていなかったのです
さらに、なぜか、カラムの型も書き忘れていたため、どうしようもない状態で、rollbackも効かないので修正のしようがありませんでした
localだけであれば、

```
$ rails db:migrate:down VERSION="migrationファイルの日付"
```
で強制的に落としてしまえばいいのですが、今回はデプロイ環境も修正しないといけません
そこで目をつけたのが、SequelProの中のschema_migrationsです
<img width="1056" alt="スクリーンショット 2019-12-19 21.19.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522204/762066eb-40e0-ae17-697a-293daebdfedc.png">
ここの日付を消してやればdownになるかもという仮説を元に、localでやると

```
Mac_Ikuy:F-market-f mac_ikuy$ rails db:migrate:status

database: F-market-f_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     000             ********** NO FILE **********
   up     20191204065204  Devise create users
   up     20191204105446  Create items
   up     20191209055720  Create categories
   up     20191209060814  Create images
   up     20191209061107  Create comments
   up     20191209061413  Create orders
   up     20191209062019  Create addresses
   up     20191210060525  Add birthday to users
   up     20191210061030  Remove birth from users
   up     20191210105227  Change datatype phone number of users
   up     20191210111956  Change datatype many of addresses
   up     20191211092256  Rename prefecture column to address
   up     20191214035200  Remove address from users
   up     20191214045010  Create cards
   up     20191216055953  Create sns credentials
   up     20191218040119  Add column to items
  down    20191218053313  Remove category from items
```
見事にダウンしてくれました
これで正しい記述に変更し、migrateすると…

```
database: F-market-f_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     000             ********** NO FILE **********
   up     20191204065204  Devise create users
   up     20191204105446  Create items
   up     20191209055720  Create categories
   up     20191209060814  Create images
   up     20191209061107  Create comments
   up     20191209061413  Create orders
   up     20191209062019  Create addresses
   up     20191210060525  Add birthday to users
   up     20191210061030  Remove birth from users
   up     20191210105227  Change datatype phone number of users
   up     20191210111956  Change datatype many of addresses
   up     20191211092256  Rename prefecture column to address
   up     20191214035200  Remove address from users
   up     20191214045010  Create cards
   up     20191216055953  Create sns credentials
   up     20191218040119  Add column to items
   up     20191218053313  Remove category from items
```

ちゃんとUPになってくれました
もちろんカラムも消えています
同様に、デプロイ環境でも同様にdownさせ、その状態でデプロイをかけると成功しました！！！

### 追加情報
ちなみに、先ほどのSequelProの中のschema_migrationsですが、コマンドでrollbackかけると自動的に最新のものが消えます
同じところ（さっきまで存在していた場所）に、消えた日付を直接書き込んで元に戻したら、UP状態になります

ぜひ、自分のテスト用のディレクトリでDBをいじって遊んでみてください


# 最後に
もう一度書きますが、何かあっても責任は負いません
ですので、会社や、大切なDBに対しては一次ソースの情報を元に作業を行なってください