laravelのマイグレーションのやり直し方がよく分からず、調べたので、メモ。
laravelマイグレーションやり直しコマンド一覧
まずはマイグレーションやり直しコマンドの一覧から紹介する。
やり直しコマンドには複数のコマンドが存在するが、いずれも以下のように、
php artisan migrate:コマンド と言う風に入力して使用する。
# laravelのマイグレーションコマンドの実行方法
php artisan migrate:コマンド
コマンドに相当する部分の一覧は下記。
- status マイグレーションの状態確認
- rollback 直前のマイグレーションをロールバック
- reset すべてのマイグレーションをロールバック
- refresh すべてのマイグレーションをロールバックしmigrateを実行。
- fresh すべてのテーブルを削除しmigrateを実行。
上記の使い方について順番に説明していく。
あと参考までに、通常のマイグレーション手順については以下の記事にまとめてあるので、
おさらいがてら読んでみて欲しい。
migrationテーブルの見方
説明をしていく前に、
laravelのmigrationsテーブルの見方を理解しておいてもらいたい。
migrationsテーブルは、マイグレーションの実施履歴を保持するテーブルだ。
マイグレーションファイル毎にレコードが存在する。
batchカラムには、ファイルがmigrateされた順番が保持されている。
以下では、create_characters_tableファイルが直近で実行されたということだ。
+------+------------------------------------------------+-------+
| Ran? | Migration | Batch |
+------+------------------------------------------------+-------+
| Yes | 2014_10_12_000000_create_users_table | 1 |
| Yes | 2014_10_12_100000_create_password_resets_table | 1 |
| Yes | 2019_08_19_000000_create_failed_jobs_table | 1 |
| Yes | 2021_01_03_105018_create_skills_table | 2 |
| Yes | 2021_01_03_111401_create_characters_table | 3 | #直近のマイグレーション(3回マイグレーションが行われたうちの3回目)
+------+------------------------------------------------+-------+
migrate後は、Ran?カラムにYesがつく。
① php artisan migrate:status
マイグレーションの状態を確認する。
見ての通り、migrationテーブルの結果を表示するコマンドだ。
特に問題はない–だろう。
php artisan migrate:status
+------+------------------------------------------------+-------+
| Ran? | Migration | Batch |
+------+------------------------------------------------+-------+
| Yes | 2014_10_12_000000_create_users_table | 1 |
| Yes | 2014_10_12_100000_create_password_resets_table | 1 |
| Yes | 2019_08_19_000000_create_failed_jobs_table | 1 |
| Yes | 2021_01_03_105018_create_skills_table | 2 |
| Yes | 2021_01_03_111401_create_characters_table | 3 |
+------+------------------------------------------------+-------+
② php artisan migrate:rollback
rollbackは、直前に行った一連のマイグレーションをなかったことにするコマンド。
rollbackを実施すると、マイグレーションファイルのdown()メソッドに書かれた処理が実行される。
先ほどのDBではbatchが3のマイグレーションがロールバックされ、状態は「No」と表示される
php artisan migrate:rollback
ロールバックが実行されるとRanのところが「No」と表示されます。
+------+------------------------------------------------+-------+
| Ran? | Migration | Batch |
+------+------------------------------------------------+-------+
| Yes | 2014_10_12_000000_create_users_table | 1 |
| Yes | 2014_10_12_100000_create_password_resets_table | 1 |
| Yes | 2019_08_19_000000_create_failed_jobs_table | 1 |
| Yes | 2021_01_03_105018_create_skills_table | 2 |
| No | 2021_01_03_111401_create_characters_table | |
+------+------------------------------------------------+-------+
–stepオプション
–step=[数値]のオプションを指定することで、[数値]回のロールバックを行うことができる。
$ php artisan migrate:rollback --step=[数値]
batchの値が3の場合で、–step=2をするとbatchが1の状態までロールバックする。
③ php artisan migrate:reset
resetは、すべてのマイグレーションをロールバックするコマンド。
$ php artisan migrate:reset
$ php artisan migrate:rollback
Rolling back: 2021_01_03_111401_create_characters_table
Rolled back: 2021_01_03_111401_create_characters_table (0.04 seconds)
Rolling back: 2021_01_03_105018_create_skills_table
Rolled back: 2021_01_03_105018_create_skills_table (0.01 seconds)
Rolling back: 2019_08_19_000000_create_failed_jobs_table
Rolled back: 2019_08_19_000000_create_failed_jobs_table (0.07 seconds)
Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back: 2014_10_12_100000_create_password_resets_table (0.03 seconds)
Rolling back: 2014_10_12_000000_create_users_table
Rolled back: 2014_10_12_000000_create_users_table (0.03 seconds)
$ php artisan migrate:status
+------+------------------------------------------------+-------+
| Ran? | Migration | Batch |
+------+------------------------------------------------+-------+
| No | 2014_10_12_000000_create_users_table | |
| No | 2014_10_12_100000_create_password_resets_table | |
| No | 2019_08_19_000000_create_failed_jobs_table | |
| No | 2021_01_03_105018_create_skills_table | |
| No | 2021_01_03_111401_create_characters_table | |
+------+------------------------------------------------+-------+
すべてのマイグレーションの状態が「No」となる。
マイグレーションを一度もしなかったことになると言うこと。
④ php artisan migrate:refresh
refreshは、
すべてのマイグレーションをロールバックしてから再びマイグレーションするコマンド。
$ php artisan migrate:refresh
$ php artisan migrate:refresh
$ php artisan migrate:refresh
Rolling back: 2021_01_03_111401_create_characters_table
Rolled back: 2021_01_03_111401_create_characters_table (0.01 seconds)
Rolling back: 2021_01_03_105018_create_skills_table
Rolled back: 2021_01_03_105018_create_skills_table (0 seconds)
Rolling back: 2019_08_19_000000_create_failed_jobs_table
Rolled back: 2019_08_19_000000_create_failed_jobs_table (0.01 seconds)
Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back: 2014_10_12_100000_create_password_resets_table (0.01 seconds)
Rolling back: 2014_10_12_000000_create_users_table
Rolled back: 2014_10_12_000000_create_users_table (0.01 seconds)
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.08 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (0.09 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.05 seconds)
Migrating: 2021_01_03_105018_create_skills_table
Migrated: 2021_01_03_105018_create_skills_table (0.05 seconds)
Migrating: 2021_01_03_111401_create_characters_table
Migrated: 2021_01_03_111401_create_characters_table (0.06 seconds)
⑤ php artisan migrate:fresh
freshは、すべてのテーブルをドロップ(削除)してから再びマイグレーションするコマンド。
$ php artisan migrate:fresh
Dropped all tables successfully.
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.08 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (0.09 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.05 seconds)
Migrating: 2021_01_03_105018_create_skills_table
Migrated: 2021_01_03_105018_create_skills_table (0.05 seconds)
Migrating: 2021_01_03_111401_create_characters_table
Migrated: 2021_01_03_111401_create_characters_table (0.06 seconds)
refreshと異なるのはロールバックが行われないこと。
つまりdown()メソッドが実行されずにDBの再構築が行われる。
- refresh:全てのテーブルをロールバックしてからマイグレーション
- fresh : 全てのテーブルをドロップ(削除)してからマイグレーション
まとめ
- status マイグレーションの状態確認
- rollback 直前のマイグレーションをロールバック
- reset すべてのマイグレーションをロールバック
- refresh すべてのマイグレーションをロールバックしmigrateを実行
- fresh すべてのテーブルを削除しmigrateを実行