migrate:refresh — マイグレーションをすべてリフレッシュして再実行するコマンド

Artisanコマンドリファレンス

Laravel Artisan コマンド:migrate:refresh

一言概要

データベースを一旦全リセットし、再度マイグレーションを実行する。

  • カテゴリ: artisan
  • 掲載バージョン: Laravel 12・PHP 8.4
  • 名前空間 / FQCN / コマンド: php artisan migrate:refresh
  • 関連: migrate:reset, migrate, db:seed, migrate:rollback, migrate:fresh
  • 変更履歴: Laravel 5.4 で追加、以降は非推奨動作はなく安定。

要点(TL;DR)

  • 使う場面: 開発中にテーブル構造を完全にリセットしたい時。
  • 最低限の使い方: php artisan migrate:refresh
  • よくある罠
  1. 本番環境で実行するとデータ損失。
  2. --seed を付け忘れるとシーダーが走らない。
  3. マイグレーションが破損していると失敗する。

概要

migrate:refreshmigrate:reset + migrate(必要なら db:seed)を一括で実行します。
データベースを初期化し、最新のマイグレーションを適用したい開発環境で頻繁に使用されます。

実行環境

環境 使い方 注意点
開発 変更後のテーブル構造を確認する際 データは必ず無い(開発用)
CI テスト前にテーブルをリセット テストスクリプトで --seed を付けるとデータセットが自動で作成
本番 使用しない データ損失が発生するため、--force も付けずに走らせない

スケジューラ(Laravel Scheduler)

// app/Console/Kernel.php
protected function schedule(Schedule $schedule): void
{
    // 毎日午前2時にテスト環境用にリフレッシュ
    $schedule->command('migrate:refresh --seed')
             ->dailyAt('02:00')
             ->onOneServer()
             ->withoutOverlapping();
}

構文 / シグネチャ

php artisan migrate:refresh [options] [--path=PATH] [--realpath] [--database=DATABASE] [--force] [--seed] [--seeder=SEEDER] [--pretend] [--step]

引数

引数 必須 既定値 説明
--path string いいえ null 実行対象のマイグレーションファイルパス(相対)
--realpath bool いいえ false --path に実際のファイルパスを指定
--database string いいえ null 使用するデータベース接続名
--force bool いいえ false 本番環境での実行を許可
--seed bool いいえ false db:seed を実行
--seeder string いいえ null カスタムシーダークラスを指定
--pretend bool いいえ false SQL を実行せずに表示
--step int いいえ 未指定(全件) 直近N件だけロールバック&再実行する件数を指定(例: --step=5)。省略時は全マイグレーションが対象

戻り値

0(成功)または 1(失敗)を返す。Laravel は内部でコマンドを実行し、終了コードで結果を示す。

例外 / 副作用

  • データ損失:すべてのテーブルが削除されるため、必ずバックアップや環境を確認。
  • トランザクション:マイグレーションは一括で実行され、途中で失敗すると全体がロールバックされる。
  • ログ--pretend を付けると、実際の SQL がコンソールに表示されるが、何も書き込まない。

使用例

コマンド 目的 結果
php artisan migrate:refresh テーブルをリセットして再適用 Migrated 12 migrations と表示
php artisan migrate:refresh --seed リフレッシュ後に seed も走らせる Migrated 12 migrations + Seeded 12 tables
# 例:ローカルでの最小限の実行
$ php artisan migrate:refresh

# 例:CI でリフレッシュ + seed
$ php artisan migrate:refresh --seed

よくある落とし穴・注意

症状 / エラー 原因 対処
SQLSTATE[42S02]: Base table or view not found マイグレーションが壊れている、あるいは古い php artisan migrate:reset でクリーン後に再実行
Connection refused データベース接続情報が不正 .envDB_* 設定を確認
Cannot find class マイグレーションファイルのクラス名とファイル名が一致しない ファイル名とクラス名を統一

代替 / 関連 API

コマンド 機能 使う場面
migrate:reset すべてのマイグレーションをロールバック(再実行はしない) 「ロールバックだけ」必要
migrate:fresh 全テーブルをDBから直接削除してマイグレーションを実行 一気に初期化 が必要、down()の実装に依存したくない
migrate:rollback 直近の1ステップだけロールバック 最近の変更だけ戻したい
migrate:status 各マイグレーションの適用状況を一覧表示 実行前に現在の状態を確認したい

migrate:refreshmigrate:reset + migrate を一括で実行できるため、「一気にリセット+再適用」 が必要なときに最適です。

migrate:freshとmigrate:refreshの違い

どちらも「テーブルを空にしてマイグレーションを再実行する」点は同じですが、内部的な仕組みが異なります。

  • migrate:refresh:各マイグレーションの down() を呼び出してロールバックしてから、up() を再実行する。down() が正しく実装されていないマイグレーションがあると失敗する。
  • migrate:freshdown() を呼ばず、DBのテーブルを直接すべて削除(DROP)してからマイグレーションを実行する。down() の実装に依存しないため、down()が未実装・不完全な場合でも動作する。

そのため、迷ったら基本的には migrate:fresh の方がシンプルで失敗しにくく、migrate:refresh は「ロールバック処理(down())自体を検証したい」場合に選ぶのが実務的な使い分けです。

テスト例(Pest)

it('refreshes migrations and seeds', function () {
    // DB のテーブルを全て削除し、再作成して seed を走らせる
    $this->artisan('migrate:refresh', ['--seed' => true]);

    // 例: users テーブルが存在し、seed が走ったことを確認
    expect(DB::table('users')->exists())->toBeTrue();
    expect(DB::table('users')->count())->toBeGreaterThan(0);
});

トラブルシュート(エラー別)

症状 / エラー 原因 対処
SQLSTATE[42S02]: Base table or view not found マイグレーションが壊れている、あるいは古い php artisan migrate:reset でクリーン後に再実行
Connection refused データベース接続情報が不正 .envDB_* 設定を確認
Cannot find class マイグレーションファイルのクラス名とファイル名が一致しない ファイル名とクラス名を統一

よくある質問(FAQ)

Q. migrate:refreshとmigrate:freshはどちらを使えばいい?
A. 用途に強いこだわりがなければ migrate:fresh の方が単純で、down()メソッドの実装ミスに影響されず確実に初期化できます。migrate:refreshdown()のロールバック処理自体をテストしたい場合や、Laravel 5.4以前からの慣習で使われているケースが中心です。

Q. –stepオプションで一部のマイグレーションだけリフレッシュできる?
A. できます。php artisan migrate:refresh --step=3 のように指定すると、直近3件のマイグレーションだけロールバック&再実行されます。省略時はすべてのマイグレーションが対象です。

Q. 本番環境でどうしても実行する必要がある場合は?
A. 基本的に非推奨です。どうしても必要な場合は事前にDBの完全バックアップを取得し、--forceオプションを付けたうえで、メンテナンスモード(php artisan down)にしてから実行してください。

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする