50
5

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 1 year has passed since last update.

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

Last updated at Posted at 2021-12-06

#はじめに

こんにちは!!!!!!
DMM WEBCAMP Advent Calendar 2021 7日目を担当します、@tamakiharuNNです!
初Advent Calendar! 初Qiita! です!

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

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

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

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

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

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

$ rails g model User name:string

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

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

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

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破壊の日々をお過ごしください!!!

50
5
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
50
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?