🍓

Laravel11 migrateコマンド/schemaコマンド

2024/12/15に公開

この記事は Laravel11にあるArtisanコマンドを全部調べる Advent Calendar 2024 15日目の記事です。

今回はmigrateコマンド/schemaコマンドについて調べました。

環境

  • PHP 8.4.1
  • laravel/laravel 11.3.3
  • laravel/framework 11.33.2

migrate

マイグレーションを実行する。

php artisan migrate

実行すると未実行のマイグレーションを実行します。

本番環境(.envのAPP_ENVがproduction)で実行すると実行確認のメッセージが表示します。

Yesを選択することでマイグレーションが実行します。

オプション 説明
--database[=DATABASE] 接続するデータベースを指定
--force 本番環境で強制的に実行
--path[=PATH] 実行するマイグレーションファイルのパスを指定
--realpath 実行するマイグレーションファイルのパスを絶対パスで指定
--schema-path[=SCHEMA-PATH] スキーマダンプファイルのパスを指定
--pretend 実行するSQLクラスを出力
--seed シーダを実行
--seeder[=SEEDER] シーダクラスを指定
--step マイグレーションを個別に実行
--graceful 失敗しても強制的に正常終了
--isolated[=ISOLATED] マイグレーションの排他実行
  • --databaseにはconfig/database.phpに書かれているデータベース接続名を指定できます
    未指定の場合はデフォルトのデータベースに接続してマイグレーションを実行します
  • 本番環境で--forceを付けると実行確認を行わないで強制的に実行します
  • --pathを使ってマイグレーションファイルのパスを指定できます ※ 複数指定可能
    ここで指定するパスはアプリケーションのベースパス配下を指定する必要がありますが、--realpathを一緒に付けると絶対パスで指定もできます
  • --schema-pathを使ってスキーマダンプファイルのパスを指定できます
    未指定の場合はdatabase/schema/{データベース接続名}-schema.sqlが指定します
  • --pretendを付けると実行するSQLが確認できますが、SQLは実行されないです
    詳しくはこちらの記事を読んでみてください。
  • --seedを付けるとマイグレーションの実行後にシーダを実行します
    この時に実行するシーダは--seederを使うことで指定することもできます(指定しない場合はDatabase\Seeders\DatabaseSeederを実行する)
  • --stepを付けるとマイグレーションを一括で実行せず1ファイル、1ファイル順番に実行します
    これはマイグレーションのロールバックする時に1ファイルだけ戻す場合に役に立ちます
  • --gracefulを付けるとマイグレーションに失敗しても強制的に正常終了させることができます
  • 複数のサーバーで同時にマイグレーションを実行する場合に--isolatedを付けるとマイグレーションの排他制御が可能になります

migrate:status

マイグレーションのステータスを確認する。

php artisan migrate:status

実行すると各マイグレーションの実行/未実行が確認できます。

advent-calendar-2024 % php artisan migrate:status

  Migration name .................................... Batch / Status
  0001_01_01_000000_create_users_table ..................... [1] Ran
  0001_01_01_000001_create_cache_table ..................... [2] Ran
  0001_01_01_000002_create_jobs_table ...................... Pending
オプション 説明
--database[=DATABASE] 接続するデータベースを指定
--pending[=PENDING] 未実行のマイグレーションを表示
--path[=PATH] 実行するマイグレーションファイルのパスを指定
--realpath 実行するマイグレーションファイルのパスを絶対パスで指定
  • --databaseにはconfig/database.phpに書かれているデータベース接続名を指定できます
    未指定の場合はデフォルトのデータベースに接続してマイグレーションを実行します
  • --pendingを使うと未実行のマイグレーションのみ確認できます(デフォルトはfalse、すべてのマイグレーションの確認です)
php artisan migrate:status --pending=true
  • --pathを使ってマイグレーションファイルのパスを指定できます ※ 複数指定可能
    ここで指定するパスはアプリケーションのベースパス配下を指定する必要がありますが、--realpathを一緒に付けると絶対パスで指定もできます

migrate:rollback

最後に実行したマイグレーションの実行をロールバックする。

php artisan migrate:rollback

実行すると最後に実行したマイグレーションの実行をロールバックします。

migrateコマンドと一緒で本番環境(.envのAPP_ENVがproduction)で実行すると実行確認のメッセージが表示します。

オプション 説明
--database[=DATABASE] 接続するデータベースを指定
--force 本番環境で強制的に実行
--path[=PATH] 実行するマイグレーションファイルのパスを指定
--realpath 実行するマイグレーションファイルのパスを絶対パスで指定
--pretend 実行するSQLクラスを出力
--step[=STEP] ロールバックするマイグレーションの数
--batch=BATCH ロールバックするマイグレーションのバッチ番号を指定
  • --databaseにはconfig/database.phpに書かれているデータベース接続名を指定できます
    未指定の場合はデフォルトのデータベースに接続してマイグレーションを実行します
  • 本番環境で--forceを付けると実行確認を行わないで強制的に実行します
    ただし、さきほどの\Illuminate\Console\Prohibitableトレイトを利用していると--forceをつけても実行できないです
  • --pathを使ってマイグレーションファイルのパスを指定できます ※ 複数指定可能
    ここで指定するパスはアプリケーションのベースパス配下を指定する必要がありますが、--realpathを一緒に付けると絶対パスで指定もできます
  • --pretendを付けると実行するSQLが確認できますが、SQLは実行されないです
  • --step--batchは指定した数だけマイグレーションのロールバックします
    • 下記の状態だと
      • --step=2の場合はつぎの2つをロールバックします(最後に実行したマイグレーションから2つ戻す)
        0001_01_01_000001_create_cache_table
        0001_01_01_000001_create_cache_table
      • --batch=2の場合はつぎの1つをロールバックします(Batch番号が2のマイグレーションを戻す)
        0001_01_01_000001_create_cache_table
      Migration name .................................... Batch / Status
      0001_01_01_000000_create_users_table ..................... [1] Ran
      0001_01_01_000001_create_cache_table ..................... [2] Ran
      0001_01_01_000002_create_jobs_table ...................... [3] Ran
      

migrate:fresh

すべてのテーブルを削除後にマイグレーションを実行する。

php artisan migrate:fresh

実行するとdb:wipeコマンドを使ってすべてのテーブルを削除し、そのあとでmigrateコマンドを実行します。

migrateコマンドと一緒で本番環境(.envのAPP_ENVがproduction)で実行すると実行確認のメッセージが表示します。

また、migrate:freshはLaravel11から確認ではなく実行を止めるために\Illuminate\Console\Prohibitableトレイトが用意されています。
こちらを利用すれば本番環境の実行ができなくなります。(書き方次第ではほかの環境でも止めることができます。)

下記が\Illuminate\Console\Prohibitableトレイトを利用して実行した結果です。

advent-calendar-2024 % php artisan migrate:fresh

   WARN  This command is prohibited from running in this environment.

詳しくはこちらの記事を読んでみてください。
https://zenn.dev/naopusyu/articles/98ca9732f5c700

オプション 説明
--database[=DATABASE] 接続するデータベースを指定
--drop-views すべてのビューを削除
--drop-types すべてのユーザー定義型を削除
--force 本番環境で強制的に実行
--path[=PATH] 実行するマイグレーションファイルのパスを指定
--realpath 実行するマイグレーションファイルのパスを絶対パスで指定
--schema-path[=SCHEMA-PATH] スキーマダンプファイルのパスを指定
--seed シーダを実行
--seeder[=SEEDER] シーダクラスを指定
--step マイグレーションを個別に実行
  • --databaseにはconfig/database.phpに書かれているデータベース接続名を指定できます
    未指定の場合はデフォルトのデータベースに接続してマイグレーションを実行します
  • --drop-viewsを付けるとすべてのビューも削除します
  • --drop-typesを付けるとすべてのユーザー定義型も削除します(PostgreSQLのみ)
  • 本番環境で--forceを付けると実行確認を行わないで強制的に実行します
    ただし、さきほどの\Illuminate\Console\Prohibitableトレイトを利用していると--forceをつけても実行できないです
advent-calendar-2024 % php artisan migrate:fresh --force

   WARN  This command is prohibited from running in this environment.
  • --pathを使ってマイグレーションファイルのパスを指定できます ※ 複数指定可能
    ここで指定するパスはアプリケーションのベースパス配下を指定する必要がありますが、--realpathを一緒に付けると絶対パスで指定もできます
  • --schema-pathを使ってスキーマダンプファイルのパスを指定できます
    未指定の場合はdatabase/schema/{データベース接続名}-schema.sqlが指定します
  • --seedを付けるとマイグレーションの実行後にシーダを実行します
    この時に実行するシーダは--seederを使うことで指定することもできます(指定しない場合はDatabase\Seeders\DatabaseSeederを実行する)
  • --stepを付けるとマイグレーションを一括で実行せず1ファイル、1ファイル順番に実行します
    これはマイグレーションのロールバックする時に1ファイルだけ戻す場合に役に立ちます

migrate:reset

すべてのマイグレーションをロールバックする。

php artisan migrate:reset

実行するとすべてのマイグレーションをロールバックします。

migrateコマンドと一緒で本番環境(.envのAPP_ENVがproduction)で実行すると実行確認のメッセージが表示します。
また、migrate:freshコマンドと一緒で\Illuminate\Console\Prohibitableトレイトを利用することで本番環境での実行ができなくなります。

オプション 説明
--database[=DATABASE] 接続するデータベースを指定
--force 本番環境で強制的に実行
--path[=PATH] 実行するマイグレーションファイルのパスを指定
--realpath 実行するマイグレーションファイルのパスを絶対パスで指定
--pretend 実行するSQLクラスを出力
  • --databaseにはconfig/database.phpに書かれているデータベース接続名を指定できます
    未指定の場合はデフォルトのデータベースに接続してマイグレーションを実行します
  • 本番環境で--forceを付けると実行確認を行わないで強制的に実行します
    ただし、さきほどの\Illuminate\Console\Prohibitableトレイトを利用していると--forceをつけても実行できないです
  • --pathを使ってマイグレーションファイルのパスを指定できます ※ 複数指定可能
    ここで指定するパスはアプリケーションのベースパス配下を指定する必要がありますが、--realpathを一緒に付けると絶対パスで指定もできます
  • --pretendを付けると実行するSQLが確認できますが、SQLは実行されないです

migrate:refresh

すべてのマイグレーションをロールバックしてからマイグレーションを実行する。

php artisan migrate:refresh

実行するとmigrate:resetコマンドを使ってすべてのマイグレーションをロールバックし、そのあとでmigrateコマンドを実行します。

migrateコマンドと一緒で本番環境(.envのAPP_ENVがproduction)で実行すると実行確認のメッセージが表示します。
また、migrate:freshコマンドと一緒で\Illuminate\Console\Prohibitableトレイトを利用することで本番環境での実行ができなくなります。

オプション 説明
--database[=DATABASE] 接続するデータベースを指定
--force 本番環境で強制的に実行
--path[=PATH] 実行するマイグレーションファイルのパスを指定
--realpath 実行するマイグレーションファイルのパスを絶対パスで指定
--seed シーダを実行
--seeder[=SEEDER] シーダクラスを指定
--step[=STEP] ロールバックして再実行するマイグレーション数を指定
  • --databaseにはconfig/database.phpに書かれているデータベース接続名を指定できます
    未指定の場合はデフォルトのデータベースに接続してマイグレーションを実行します
  • 本番環境で--forceを付けると実行確認を行わないで強制的に実行します
    ただし、さきほどの\Illuminate\Console\Prohibitableトレイトを利用していると--forceをつけても実行できないです
  • --pathを使ってマイグレーションファイルのパスを指定できます ※ 複数指定可能
    ここで指定するパスはアプリケーションのベースパス配下を指定する必要がありますが、--realpathを一緒に付けると絶対パスで指定もできます
  • --seedを付けるとマイグレーションの実行後にシーダを実行します
    この時に実行するシーダは--seederを使うことで指定することもできます(指定しない場合はDatabase\Seeders\DatabaseSeederを実行する)
  • --stepは指定した数だけマイグレーションのロールバックを行なってから、マイグレーションの再実行します
    この時のロールバックはmigrate:rollbackコマンドが実行します

migrate:install

migrationsテーブルを作成する。

php artisan migrate:install

実行するとmigrationsテーブルを作成します。
作成するテーブル名はconfig/database.phpで指定しているので別の名前に変更することもできます。

config/database.php
    'migrations' => [
        'table' => 'migrations', // ここを書き換えるとテーブル名を変えることができる
        'update_date_on_publish' => true,
    ],
オプション 説明
--database[=DATABASE] 接続するデータベースを指定
  • --databaseにはconfig/database.phpに書かれているデータベース接続名を指定できます
    未指定の場合はデフォルトのデータベースに接続してマイグレーションを実行します

schema:dump

スキーマダンプファイルを作成する。

php artisan schema:dump

実行すると実行済みのマイグレーションの内容からdatabase/schemaディレクトリにスキーマダンプファイルを作成します。
ファイル名は{データベース接続名}-schema.sqlと接続先のデータベース名に対応します。

このスキーマダンプファイルを作成しておくと、migrateコマンド実行時に最初にスキーマダンプファイルの内容を実行し、そのあとで未実行のマイグレーションを実行します。

オプション 説明
--database[=DATABASE] 接続するデータベースを指定
--path[=PATH] スキーマダンプファイルのパスを指定
--prune マイグレーションファイルを削除
  • --databaseにはconfig/database.phpに書かれているデータベース接続名を指定できます
    未指定の場合はデフォルトのデータベースに接続してマイグレーションを実行します
  • --pathを使ってスキーマダンプファイルのパスを指定できます(未指定ならdatabase/schema/{データベース接続名}-schema.sqlになる)
  • --pruneを付けるとdatabase/migrations配下のマイグレーションファイルを削除します(migrationsディレクトリも消えます)
GitHubで編集を提案

Discussion