115
106

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 3 years have passed since last update.

【laravel】マイグレーション、やり直しコマンドいろいろ

Posted at

テーブルの修正、再構築のコマンドについて簡単にメモします。

マイグレーションはそのDBのmigrationsテーブルで管理されます。
migrationsテーブルにはbatchというカラムがあり、値の順にmigrateされたことを表します。下のDBではcreate_photos_tableファイルが直近で実行されたということになります。
スクリーンショット 2020-02-05 11.51.43.png
###status
マイグレーションの状態を確認します。

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  | 2020_02_05_015307_create_albums_table          | 2     |
| Yes  | 2020_02_05_020352_create_photos_table          | 3     |
+------+------------------------------------------------+-------+

このDBでは1,2,3の順でマイグレーションが実行されたこと表しています。

###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  | 2020_02_05_015307_create_albums_table          | 2     |
| No   | 2020_02_05_020352_create_photos_table          |       |
+------+------------------------------------------------+-------+

・--stepのオプションで[数値]回のロールバックを行います。
batchの値が3の場合、php artisan migrate:rollback --step=2をするとbatchが1の状態まで戻ります。

$ php artisan migrate:rollback --step=[数値]

###reset
すべてのマイグレーションをロールバックします。

$ php artisan migrate:reset
$ php artisan migrate:reset
Rolling back: 2020_02_05_015307_create_albums_table
Rolled back:  2020_02_05_015307_create_albums_table 
Rolling back: 2019_08_19_000000_create_failed_jobs_table
Rolled back:  2019_08_19_000000_create_failed_jobs_table 
Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back:  2014_10_12_100000_create_password_resets_table 
Rolling back: 2014_10_12_000000_create_users_table
Rolled back:  2014_10_12_000000_create_users_table 

$ 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   | 2020_02_05_015307_create_albums_table          |       |
| No   | 2020_02_05_020352_create_photos_table          |       |
+------+------------------------------------------------+-------+

すべてのマイグレーションの状態が「No」となります。

###refresh
すべてのマイグレーションをロールバックしてから再びマイグレーションします。

$ php artisan migrate:refresh
$ php artisan migrate:refresh

Rolling back: 2020_02_05_020352_create_photos_table
Rolled back:  2020_02_05_020352_create_photos_table (0.02 seconds)
Rolling back: 2020_02_05_015307_create_albums_table
Rolled back:  2020_02_05_015307_create_albums_table (0.02 seconds)
Rolling back: 2019_08_19_000000_create_failed_jobs_table
Rolled back:  2019_08_19_000000_create_failed_jobs_table (0.02 seconds)
Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back:  2014_10_12_100000_create_password_resets_table (0.02 seconds)
Rolling back: 2014_10_12_000000_create_users_table
Rolled back:  2014_10_12_000000_create_users_table (0.02 seconds)
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.06 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.06 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.04 seconds)
Migrating: 2020_02_05_015307_create_albums_table
Migrated:  2020_02_05_015307_create_albums_table (0.04 seconds)
Migrating: 2020_02_05_020352_create_photos_table
Migrated:  2020_02_05_020352_create_photos_table (0.04 seconds)

###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.06 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.06 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.04 seconds)
Migrating: 2020_02_05_015307_create_albums_table
Migrated:  2020_02_05_015307_create_albums_table (0.04 seconds)
Migrating: 2020_02_05_020352_create_photos_table
Migrated:  2020_02_05_020352_create_photos_table (0.04 seconds)

refreshと異なるのはロールバックが行われないこと。つまりdown()メソッドが実行されずにDBの再構築が行われる点。
したがって複数DBを持つプロジェクトではfreshを行うとエラーが出てしまいます。なぜなら一方のDBだけが削除されてしまうためです。

###まとめ
status マイグレーションの状態確認
rollback 直前のマイグレーションをロールバック
reset すべてのマイグレーションをロールバック
refresh すべてのマイグレーションをロールバックしmigrateを実行。
fresh すべてのテーブルを削除しmigrateを実行。

115
106
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
115
106

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?