【Laravel】db:wipe・migrate:fresh・migrate:resetの違いと使い分け
最終更新: 2026年4月 | Laravel 12対応
Laravelでデータベースをリセットしたいとき、db:wipe・migrate:fresh・migrate:reset の3つが候補に挙がります。
「とりあえず migrate:fresh を使っているけど、他との違いがよくわからない」
「db:wipe って何のためにあるの?」
「どのコマンドを使えばいい?」
30年の実務経験をもとに、3つのコマンドの違いと正しい使い分けを具体的に解説します。
1. 3つのコマンドの違い
| コマンド | テーブル削除 | マイグレーション再実行 | migrationsテーブル |
|---|---|---|---|
db:wipe | ✅ 全削除 | ❌ しない | ✅ 一緒に削除される |
migrate:fresh | ✅ 全削除 | ✅ する | ✅ 再作成される |
migrate:reset | ❌ しない | ⬇️ ロールバックのみ | ✅ 更新される |
一言でまとめると:
db:wipe→ ただ消すだけ。その後どうするかは自分で決めるmigrate:fresh→ 消してマイグレーションを最初からやり直すmigrate:reset→ ロールバックして元の状態に戻す
2. 各コマンドの詳細
db:wipe
php artisan db:wipe
実行結果:
INFO Dropped all tables successfully.
全テーブル・ビュー・タイプを削除します。マイグレーションは再実行しません。
オプション一覧:
| オプション | 説明 |
|---|---|
--database= | 使用するDB接続を指定 |
--drop-views | ビューも一緒に削除 |
--drop-types | タイプも削除(PostgreSQLのみ) |
--force | 本番環境での強制実行 |
migrate: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 (12.34ms)
...
全テーブルを削除してから、全マイグレーションを最初から実行します。--seed オプションと組み合わせて使うことが多いです。
php artisan migrate:fresh --seed
migrate:reset
php artisan migrate:reset
実行結果:
Rolling back: 2023_02_20_add_status_to_posts_table
Rolled back: 2023_02_20_add_status_to_posts_table (8.12ms)
Rolling back: 2023_01_15_create_posts_table
Rolled back: 2023_01_15_create_posts_table (5.43ms)
...
全マイグレーションをロールバックします。テーブルは削除されますが、migrate:fresh と違い down() メソッドを通じて段階的に処理されます。
3. 使い分けの基準
実務で30年使ってきた判断基準を整理するとこうなります。
開発中にDB全体をリセットしたい
→ migrate:fresh --seed が正解。これ一択です。
マイグレーションファイルを整理・削除したあとにDBもリセットしたい
→ db:wipe が使える唯一のシーン。migrate:fresh だと削除したファイルの down() が動かず失敗することがあるため。
ロールバックの動作確認をしたい
→ migrate:reset。down() メソッドが正しく書けているか確認できます。
テスト環境で毎回クリーンな状態にしたい
→ RefreshDatabase トレイトを使うのが正解。コマンドを手動で叩く必要はありません。
4. 注意点
本番環境では使わない
3つとも本番環境での実行は原則禁止です。--force オプションをつければ実行できますが、全データが失われます。
# 絶対にやってはいけない(本番環境で)
php artisan db:wipe --force
php artisan migrate:fresh --force
migrate:fresh は down() を使わない
migrate:fresh はテーブルを直接 DROP するため、down() メソッドは実行されません。migrate:reset と混同しないように注意してください。
# migrate:fresh → DROP TABLE を直接実行(down()は使わない)
# migrate:reset → down()メソッドを通じてロールバック
5. よく使うコマンドパターン
# 開発中の基本リセット(これが一番よく使う)
php artisan migrate:fresh --seed
# マイグレーション状態確認してからリセット
php artisan migrate:status
php artisan migrate:fresh --seed
# ロールバックの動作確認
php artisan migrate:reset
php artisan migrate
# マイグレーションファイル整理後のリセット
php artisan db:wipe
php artisan migrate --seed
まとめ
| やりたいこと | 使うコマンド |
|---|---|
| 開発中にDBを全リセットしたい | migrate:fresh --seed |
| マイグレーションファイルを整理後にリセット | db:wipe → migrate |
down() の動作確認をしたい | migrate:reset |
| テストで毎回クリーンにしたい | RefreshDatabase トレイト |
迷ったら migrate:fresh --seed を使っておけば、開発中はほぼ困りません。db:wipe は「マイグレーションファイルの状態に関係なく、とにかく全消去したい」という限られたケースで使うコマンドです。



