Laravel11 migrateコマンド/schemaコマンド
この記事は 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.
詳しくはこちらの記事を読んでみてください。
オプション | 説明 |
---|---|
--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で指定しているので別の名前に変更することもできます。
'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ディレクトリも消えます)
Discussion