Laravel5.8でMigrationを行う

目次
Dockerの調子が悪くて・・・
最近Dockerの調子が悪く、何度かFactory Resetを繰り返し行っていました
で、Factory Resetの度にコンテナやらイメージやらボリュームやらが全部リセットとなり
結果、DBのデータやテーブル構造なども失われていたわけです
今まではMySql Workbench上から作り直していたのですが、さすがに何度も続くとめんどくさくなってきたので Laravelに組み込まれている「Migration」という機能を利用してDB管理を行うことにしました
そもそもMigrationとは?
Migration(マイグレーション)とは、「データベースの管理をコードで行える仕組みのこと」と、自分は解釈しています
実際にやってみる
公式マニュアルはこちら
https://readouble.com/laravel/5.8/ja/migrations.html
LaravelでMigrationを行うには以下の通り
Laravelプロジェクトに移動し、以下のコマンドを実行
php artisan make:migration loto7
上記のコマンドを実行すると、以下のディレクトリにファイルが作成されます
(Laravelプロジェクトフォルダ)\database\migrations19_03_31_085703_loto7.php
中を見ると、 up
と down
の2つのメソッドが準備されています
up : 新規テーブルやカラムの作成
down : up時の操作を戻す
という役割があります
基本的に up
にはcreate table などを記述し、 down
には drop tableなどを記述することになるかと思います
実際に記述してみる
今回は宝くじ情報のサイトを作る想定でいるので、その情報を保存できるようにテーブルを作成します
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class Loto7 extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('loto7', function (Blueprint $table) {
$table->increments('holding_count');
$table->unsignedInteger('holding_date');
$table->timestamps();
});
Schema::create('loto7_winning_numbers', function (Blueprint $table) {
$table->increments('holding_count');
$table->unsignedInteger('number');
$table->timestamps();
});
Schema::create('loto7_bonus_numbers', function (Blueprint $table) {
$table->increments('holding_count');
$table->unsignedInteger('number');
$table->timestamps();
});
Schema::create('loto7_winning_count', function (Blueprint $table) {
$table->increments('holding_count');
$table->unsignedInteger('1st');
$table->unsignedInteger('2nd');
$table->unsignedInteger('3rd');
$table->unsignedInteger('4th');
$table->unsignedInteger('5th');
$table->unsignedInteger('6th');
$table->timestamps();
});
Schema::create('loto7_winning_money', function (Blueprint $table) {
$table->increments('holding_count');
$table->unsignedInteger('1st');
$table->unsignedInteger('2nd');
$table->unsignedInteger('3rd');
$table->unsignedInteger('4th');
$table->unsignedInteger('5th');
$table->unsignedInteger('6th');
$table->timestamps();
});
Schema::create('loto7_carryover', function (Blueprint $table) {
$table->increments('holding_count');
$table->unsignedBigInteger('carry_over');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('loto7');
Schema::drop('loto7_winning_numbers');
Schema::drop('loto7_bonus_numbers');
Schema::drop('loto7_winning_count');
Schema::drop('loto7_winning_money');
Schema::drop('loto7_carryover');
}
}
こんな感じの内容で作ってみました
マイグレーションを実行する
artisanコマンドを実行すれば、先ほど作成したファイルの内容が実行され、テーブル類が作成されます
気を付けるのはLaravelプロジェクトの.envファイルの設定で、このファイルに書かれているDBの接続設定が使用されます
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=lottery
DB_USERNAME=root
DB_PASSWORD=root
今回、.envファイルはDockerネットワーク内で実行される想定で作ったので、Laradockのworkspaceからマイグレーションを実行します
ちなみに、ホストから実行する場合は.envファイルを
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=lottery
DB_USERNAME=default
DB_PASSWORD=default
のように変更する必要があります
また、マイグレーションを実行するとき、 information_schemaへのアクセスが可能なユーザーで行う必要があるようで、自分の環境では以下のエラーが発生しました
そのため、設定ファイルでrootユーザーを指定し、実行しています
Docker workspaceへ
PortainerというDocker管理ツールを利用し、Laradockのワークスペースに入りました
ここでマイグレーションを実行します
php artisan migrate
これでマイグレーションが実行されます
成功すると、このようなログが出力されます
MySQL Workbenchで確認すると、きちんとテーブルが出来ていますね
以上です
これでマイグレーションの紹介は以上です
DBをコードで管理できるので、元に戻したり、環境の作り直しも簡単に行えそうですね
ただ、簡単にdropもできてしまうため、本番運用では気を使いそうです