Laravelのマイグレーションファイルを更新してはいけない理由

ダメダメすぎて梅干し顔 フリー素材ぱくたそ(www.pakutaso.com)
  • URLをコピーしました!
目次

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) のままです。障害発生です!!となりますので、一度リリースしたマイグレーションファイルは、二度と更新してはいけないのです。

Footnotes

  1. 「知らなくても」と書きましたが、知らなかったらきっとある程度の設定しかできないですよね。ですので、SQLの勉強もしっかりしてもらいたいです!(^^)/

ツチノコテクノロジーに開発・保守を発注しませんか?

Laravel・Flutterの開発・保守をツチノコテクノロジーに発注しませんか?

まずはZOOMで打ち合わせ

お申し込みはこちら

ツチノコテクノロジーでは一緒に働く仲間を募集しています!

完全リモートで働きたい方へ!

詳しくは以下をご覧ください。

ツチノコテクノロジー採用サイト

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

ツチノコテックアカデミアの記事は、社内で誰かが質問してくれたことに回答したときに、ついでに記載しています!(^^)/
みんなの悩みを共有すれば、きっと誰かの役に立つと信じて更新しています!

目次