#はじめに
こんにちは!!!!!!
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ファイルの中身↓↓
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
###ダミーファイル内に記述を追加
ダミーファイル内に以下の記述を追加していきます
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破壊の日々をお過ごしください!!!