💨

Laravelにおけるmigrate:refreshとmigrate:freshの違い

2024/01/23に公開

はじめに

Laravelのマイグレーションシステムは、データベースの構造を管理する際に非常に強力です。
migrate:refreshmigrate:freshのコマンドは、開発時はデータベースの更新とリセットに役立ちますが、これらのコマンドは異なる振る舞いをするためこの記事で解説していきます。

ロールバックと再マイグレーション

migrate:refreshコマンドは、既に適用されているすべてのマイグレーションをロールバックし、その後、再度全てのマイグレーションを実行します。
これはデータベースの構造を変更する際に、既存のテーブルを保持しつつ更新を行う場合に有効です。
しかし、マイグレーションの履歴はデータベースに保存されたままであり、履歴自体は削除されません。

全テーブルの削除と新規マイグレーション

一方、migrate:freshコマンドは、データベースの全てのテーブルを削除し、その後全てのマイグレーションを最初から再実行します。
これはデータベースを完全にリセットし、新鮮な状態からスタートすることが可能になります。
しかし、マイグレーションファイルで管理されていないテーブルも削除されてしまうため、注意が必要です。

動作の違いを検証

ここでは、これらのコマンドが実際にデータベースにどのような影響を与えるのかを検証します。

マイグレーションファイルで管理していないテーブルへの影響

まず、Laravelのマイグレーションファイルに記載されていないテーブルに対して、直接SQLクエリをデータベースコンソールから実行して作成しました。

CREATE TABLE test (id int, name varchar(10));

この時点でのデータベースのテーブル一覧は以下の通りです。

failed_jobs
migrations
password_reset_tokens
personal_access_tokens
test
users

migrate:refreshを実行した後のテーブル一覧は次のようになりました。

failed_jobs
migrations
password_reset_tokens
personal_access_tokens
test
users

この結果から、migrate:refreshはLaravelのマイグレーションファイルで管理されているテーブルのみをロールバックし、再適用することが確認できます。
手動で作成されたtestテーブルは影響を受けていないことが分かりました。

次に、migrate:freshを実行してみると、テーブル一覧は以下のように変わりました。

failed_jobs
migrations
password_reset_tokens
personal_access_tokens
users

この結果から、migrate:freshはデータベース内のすべてのテーブルを削除し、マイグレーションファイルで定義されたテーブルのみを再構築することが明らかとなりました。
この場合、手動で作成されたtestテーブルが削除されていることが確認できます。
migrate:freshを使用する際は、マイグレーションファイル外のテーブルが削除される可能性があるため、特に注意が必要になってきます。

まとめ

Laravelのmigrate:refreshmigrate:freshコマンドは似ているように見えますが、実際には異なる目的と影響を持っています。
開発環境では、これらのコマンドを使ってデータベースの状態を迅速に変更し、新しい機能のテストやバグの修正を行うことができます。
しかし、本番環境では、これらのコマンドの使用にはより慎重なアプローチが必要になります。
特にmigrate:freshを本番環境で使用する場合は、データのバックアップや影響範囲の評価を十分に行うことが重要です。

GitHubで編集を提案

Discussion