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

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

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

DB環境設定

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

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

// .env

...

DB_CONNECTION=sqlite

...

// config/database.php

    ...   

    'default' => env('DB_CONNECTION', 'mysql'),

    ...

    'connections' => [

        'sqlite' => [
            'driver'   => 'sqlite',
            'database' => storage_path('database.sqlite'),
            'prefix'   => '',
        ],

    ...

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

$ touch storage/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.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table

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

$ sqlite3 storage/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         

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

$ php artisan migrate

Nothing to migrate.

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

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

$ php artisan migrate:rollback

Rolled back: 2014_10_12_100000_create_password_resets_table
Rolled back: 2014_10_12_000000_create_users_table

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

$ sqlite3 storage/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 IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

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', 60);
            $table->rememberToken();
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('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.1/migrations#writing-migrations


まとめ

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

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中