もう、マイグレーション怖くない(PHP Laravel)

その他

+1

Laraveler歴1年で、やっと経験が増えてきてマイグレーションが怖くなくなったriikuuです。

DBを書き換える?怖すぎ!って思っていた1年前。

しかし、経験を積むとリカバリが効くようになるので怖いものなんてなしです!このブログは、その1年で積んだ経験を忘れないために&ほかの言語を学んだときに、参考にできるようにメモしておきます!

(今怖いのはインフラ、セキュリティ周り、CodeCovとかgithubとかのニュース多くない?)

マイグレーションってなに?

マイグレーションとは、DBの変更履歴を記載しておくファイルになります。

DBを追加する、削除するはもちろん、カラムの追加、変更、移動なども責任範囲になります。

シーダーとかコマンドなども同じようなことができますが、いざとなったらなかったことにできるのがマイグレーションの強みです。

そのマイグレーション、なかったことにできる…って、どゆこと?

マイグレーションの利点はその変更をなかったことにできる所にあります。

追加時はup、戻すときはdownのコードを読み取ります。なので可逆な変更になっています。

例えばユーザーテーブルに性別が必要になった!となれば、upには

ユーザーテーブルに性別を追加する

Schema::table('users', function (Blueprint $table) {
    $table->string('gender');
});

と記述し、downには

Schema::table('users', function (Blueprint $table) {
    $table->dropColumn('gender');
});

ユーザーテーブルから性別を削除する

と書きます。

これで、可逆なDBの変更を行えます!

次に性別なのでenumでmaleかfemaleかotherだけの情報を持ちたいとなったとします。その場合upには、

ユーザーテーブルの性別をenumに変更する

Schema::table('users', function (Blueprint $table) {
    $table->enum('gender', ['male', 'female', 'other'])->change();
});

と書き、downには

ユーザーテーブルの性別をstringに戻す

Schema::table('users', function (Blueprint $table) {
    $table->string('gender')->change();
});

とします。

ここでenumについては、中級者でもつまづく制約があるので要注意です。

  • enumの追加はできるが既存のenumを減らすことはできない
  • カラム名変更もできない

こんなときはどうする?マイグレーション編

マイグレーションファイルを扱っていると以下のようなことをしたくなることがあります。それらの対処法を紹介します。(責任は取れないのであしからず、ご相談はTwitterのDMにて!)

  • 過去のマイグレーションファイルにミスが発覚、使っている箇所が限られているので修正したい。
  • ローカルでテスト中、カラムを追加したいテーブルを間違ったので作り直したい(一度もマイグレーションをしていない)
  • 上記でローカル内でマイグレーションをしてしまった
  • マイグレーションした後、マイグレーションファイルを完全に削除してしまったがロールバックしたい。

こちらは下記の記事で紹介しています!

+1

Posted by riku