DB破壊日記 ~間違えてmigrationファイル消しちゃった編~

#はじめに

こんにちは！！！！！！
[DMM WEBCAMP Advent Calendar 2021](https://qiita.com/advent-calendar/2021/infratop) 7日目を担当します、@tamakiharuNNです！
初Advent Calendar! 初Qiita! です!

チームのアドベントカレンダーのテーマが
「**プログラミングを始めたばかりの人もわかる、ハンズオンや言語基礎**」
ということで
自分がプログラミング始めたての頃に何に困ったっけ～？と考えました。

すぐに見つかりました。
###DB破壊です。
rollbackしてmigrationファイル修正したり(rollbackは適切にやれば問題ありません)
status変更する前にmigrationファイル削除したり

始めた当初は何をしたらどうなるかわからず、
とりあえずやってみよう、壊れたら作り直そ～の精神でハチャメチャやってました笑
(**チーム開発では取り返しがつかなくなるので良い子はマネしないように！**)

というわけで今回は
Railsを始めたての頃の自分に教えるつもりで
「**間違えてマイグレーションファイル消しちゃったときの対処法**」
をお届けしようかなと思います！

#準備
まず準備として
**migrationファイルを作成して消します................................消します！**

###migrationファイルの作成とschemaに反映
migrationファイルを作成

~~~
$ rails g model User name:string
~~~

↓↓作成されたmigrationファイルの中身↓↓

~~~ruby:20211206104111_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :name
      t.timestamps
    end
  end
end
~~~

`rails db:migrate` を実行して`schema.rb`に反映

###migrationファイルの削除
先ほど作成したmigrationファイルを右クリックでDeleteでおっけーです

#statusの確認
`rails db:migrate:status`でmigrationファイルのstatusを確認します

`rails db:migrate:status`について簡単に説明すると
migrationファイルにはstatusというものがあって

**①rails db:migrateをするとstatusがupになる
②statusがupの状態でファイルを削除してもデータベース上には残る**

といった感じです。実際の実行結果を見てみましょう。

↓↓実行結果↓↓(Create itemsは削除したものと比較するために追加しました)

~~~
$ rails db:migrate:status

Status   Migration ID    Migration Name
--------------------------------------------------
   up     20211206104111  ********** NO FILE **********
   up     20211206114511  Create items
~~~

********** NO FILE **********となっているのが先ほど削除したファイルです
削除したとしたとしてもこのように残ってしまいます

#migrationファイルを正しく消す手順
じゃあ残さずに消す方法は何だという話になります、答えは
**statusをdownにしてから削除する**
です

Create itemsの方をdownにします
downにする方法もいくつかありますが、今回は指定のmigrationファイルをdownにする方法を取りたいと思います

コマンドは`rails db:migrate:down VERSION=downにしたいmigration id`です
(migration idは先ほどの`rails db:migrate:status`の実行結果から確認できます)
今回は`id 20211206114511` のmigrationファイルをdownにするので

~~~
$ rails db:migrate:down VERSION=20211206114511
~~~

もう一度migrationファイルのステータスを確認すると

~~~
$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20211206104111  ********** NO FILE **********
  down    20211206114511  Create items
~~~

このようにCreate itemsのmigrationファイルはstatusがdownになっています
この状態でファイルを削除して、statusを確認すると・・・

~~~
$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20211206104111  ********** NO FILE **********
~~~

**Create itemsはちゃんと消えています！**

migrationファイルを消す時はdownにしてから消せばおっけーです

#NO FILEの解決方法
次にNO FILEとなってしまった方も消しましょう！

手順としては
**①ダミーファイルを作成
②ダミーファイル内に記述を追加
③ダミーファイルのstatusをdownに
④migrationファイルの削除**
です

###ダミーファイルを作成
以下のコマンドを実行し、ダミーファイルを作成します
(ファイル名の数字はNO FILEとなっているmigration idをコピペすればおっけーです)

~~~
$ touch db/migrate/20211206104111_hoge.rb
~~~

###ダミーファイル内に記述を追加
ダミーファイル内に以下の記述を追加していきます

~~~ruby:20211206104111_hoge.rb
class Hoge < ActiveRecord::Migration[5.2]
  def change
  end
end
~~~

###ダミーファイルのステータスをdownに
ここで一度`rails db:migrate:status`を実行してみましょう

~~~
$ rails db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20211206104111  Hoge
~~~

**Migration Nameが復活してる！！！！！！！！！**
あとはdownにして削除するだけです

~~~
$ rails db:migrate:down VERSION=20211206104111
~~~

statusの確認

~~~
$ rails db:migrate:status

Status   Migration ID    Migration Name
--------------------------------------------------
  down    20211206104111  Hoge
~~~

最後に削除しましょう！

###migrationファイルの削除
ダミーファイルを削除します。
右クリックで削除でおっけーです！

#おわりに
DB関連のエラーは最初よくわからないし、怖いですよね
できるだけ壊さないで勉強するのがいいですが、
**百聞は一見にしかず！覚悟をもって破壊するもよし！**
としてハチャメチャしちゃうのもありなのかな～と思ったり・・・
(弊社では壊した際の責任は問いかねます笑)

とにかく、プログラミング上達のためには
自分で動かすほど大事なことはありません
なので
###皆さんもよいDB破壊の日々をお過ごしください！！！