初めてのLaravel 5.6 : (7) マイグレーションでDBのバージョン管理

データベースのバージョンを管理するマイグレーション機能を使ってみます。

  • マイグレーションを実行して、DBにテーブルを作成する
  • ロールバックして、DBのバージョンを戻す
  • マイグレーションファイルの中身を見てみる

DB環境設定

まず初めに、DBの環境設定を行います。DBの環境設定は以前に書いた、データベースの環境設定 を参照してください。

この記事ではデーターベースに SQLiteを指定します。

# .env

DB_CONNECTION=sqlite

# sqlite のデフォルト設定を使うのでコメントアウト
# DB_DATABASE=homestead

SQLiteのデータベースファイルを手動で作成しておきます。

touch database/database.sqlite

マイグレーションの実行

実は、Laravelプロジェクトを作成した時に2つのマイグレーションファイルが作成されています。

database/
└── migrations
    ├── 2014_10_12_000000_create_users_table.php
    └── 2014_10_12_100000_create_password_resets_table.php

この2ファイルはそれぞれ、テーブルを作成する内容になっています。Laravel ではプロジェクトを作成した時点で、ユーザ認証機能が組み込まれるようになっています。その為、ユーザ用のテーブルとパスワード再確認用のテーブルを作成するマイグレーションファイルが既にあります。ユーザ認証の話は今回は置いておいて、マイグレーションに絞って説明します。

では、これらを実行してみます。

php artisan migrate

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table

sqlite3 コマンドを使って、テーブルが作成されているか確認してみます。

sqlite3 database/database.sqlite 

sqlite> .tables
migrations  password_resets  users          

3つのテーブルが作成されました。

  • migrations
  • users
  • password_resets

migrationsテーブルの中身を見てみると、実行されたマイグレーションファイル名が記録されていました。

sqlite> select * from migrations;
migration                             batch     
------------------------------------  ----------
2014_10_12_000000_create_users_table  1         
2014_10_12_100000_create_password_re  1         

ここで一旦 sqlite3 から抜けます。

sqlite> .q

もう一回、マイグレーションを実行してみると、何も実行されずに終了します。

php artisan migrate

Nothing to migrate.

マイグレーションのロールバック

テーブル作成を取り消して、DBを1つ前の状態に戻してみます。

php artisan migrate:rollback

Rolling back: 2014_10_12_100000_create_password_resets_table
Rolled back:  2014_10_12_100000_create_password_resets_table
Rolling back: 2014_10_12_000000_create_users_table
Rolled back:  2014_10_12_000000_create_users_table

sqlite3 コマンドを使って、テーブルが削除されているか確認してみます。

sqlite3 database/database.sqlite 

sqlite> .tables
migrations

sqlite> select * from migrations;
sqlite>          

users, password_resetsテーブルが削除されて、migrationsテーブルの内容が空になっていました。migrationsテーブルは残っていますが、それ以外はマイグレーションを実行する前の状態に戻りました。


マイグレーションファイルの中身

マイグレーションファイルの中身を見てみます。

<?php
// database/migrations/2014_10_12_000000_create_users_table.php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('users');
    }
}

Migrationクラスを継承した、CreateUsersTableクラスが定義されています。
ポイントは up(), donw() 関数です。
マイグレーション実行時の DB のバージョンアップ処理を up()関数に記述します。その逆に、ロールバック実行時の DB のバージョンダウン処理を down()関数に記述します。上記のファイルでは、up()で、usersテーブルを作成し、down()で usersテーブルを削除しています。

スキーマビルダー

Schema::xxxx と書かれている部分が、実際にDBに操作をしている箇所になり、これらをスキーマビルダーと読んでいます。

  • Schema::create(‘テーブル名’, Closure $callback) – テーブルの作成
  • Schema::drop(‘テーブル名’) – テーブルの削除

スキーマビルダーの詳細は下記のページで確認できます。
http://laravel.com/docs/5.6/migrations


まとめ

マイグレーションでDBのバージョンを管理すると、DBの再構築が容易になります。複数の開発者のPC上でDBの整合性を合わせることが簡単になりますし、ステージング環境や本番環境のDBバージョンアップも簡単にできます。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中