Q. なぜマイグレーションファイルをあとから更新してはいけないのですか?
A. 「一度実行されたマイグレーションファイルは実行されない」からです!
そんなん php artisan migrate:fresh
すればいいじゃん!ですって?
本番環境でデータベースをまっさらにして一からやり直すなんて一生できません!
ということで、マイグレーションファイルをあとから更新してはいけません絶対にです!
Gitでもし更新ログを見つけてしまったら、速攻で元に戻して、新しいマイグレーションファイルに置き換えましょう!
マイグレーションの説明
Laravelにはマイグレーションという、データベーススキーマを操作するツールがあります。
公式説明 マイグレーション
https://readouble.com/laravel/8.x/ja/migrations.html
マイグレーションファイルを作成するコマンドはこちらです
php artisan make:migration create_flights_table
個人的にはこちらの記事でも紹介していますが、Modelのmakeコマンドからマイグレーションファイルを作成することをお薦めします!
php artisan make:model Flight --all
公式の説明にもあるとおり、以下のようなクラスを作成することで、新しいテーブルを作成したり、更新したり、削除したりできます。DDLを知らなくても、LaravelがPHPで SQL を書いてくれるということですね!1
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateFlightsTable extends Migration
{
/**
* マイグレーションの実行
*
* @return void
*/
public function up()
{
Schema::create('flights', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('airline');
$table->timestamps();
});
}
/**
* マイグレーションを戻す
*
* @return void
*/
public function down()
{
Schema::drop('flights');
}
}
このファイルを作成後に、以下のコマンドを実行することで、実際にデータベースに変化を起こせます。
php artisan migrate
このとき、実行されたファイル名が保存されます!
そして、 php artisan migrate
を次に実行する際には、「 20220814_133000_create_flights_table.php
はもう実行済みだからスキップ」ということをきちんと制御してくれます。
もし一度リリースしたマイグレーションファイルを更新してしまった場合、その更新は実行されません。しかし、開発環境など新規に作り直す(スクラップ&ビルドを繰り返す環境)では、その更新したマイグレーションファイルで変更されたデータベースが定義されてしまいます。
この状態で開発すると、もうお分かりかと思いますが、障害が発生する確率が飛躍的に高まります。
例えば、名前 name は varchar(15)
のカラムでした。それを varchar(256)
に変更しました。画面から入力された name の桁数チェックは当然長く変更するでしょう。マルチバイト文字で3文字までだったところを50 文字まで許可することにします。開発環境ではうまくいきました。では本番環境ではどうでしょうか。なんと本番は varchar(15)
のままです。障害発生です!!となりますので、一度リリースしたマイグレーションファイルは、二度と更新してはいけないのです。