商売力開発ブログ

非エンジニアがWebサービスの開発、運営によって商売力をつける記録、その他の雑記

Laravelのデータベースのマイグレーション機能 順番を強引に入れ替えることも可能

【スポンサーリンク】

今回はPHPフレームワークの一つのLaravelの中から、データベースのマイグレーションの機能について、その概要を紹介します。
今回利用するDBはMySQLですが、他のDBでもほぼ同様に対応できます。
またマイグレーションに関連する内容は以下を参照して下さい。

Laravelのマイグレーション機能の活用① メンバ変数を追加した上でテーブルのコメント追加も簡単に設定する方法 - 商売力開発ブログ
Laravelのマイグレーション機能の活用② 1つのファイルで複数のテーブル管理も可能 - 商売力開発ブログ
Laravelのマイグレーション機能の活用③ カラム定義の管理を楽にする方法 - 商売力開発ブログ
Laravelのマイグレーション機能の活用④ カラム定義のメソッド設定例 - 商売力開発ブログ
Laravelのマイグレーション機能の活用⑤ 複数テーブルに同じカラムを追加する - 商売力開発ブログ

Laravelのマイグレーションの機能の概要

Laravelでマイグレーションと呼んでいるものはデータベースのバージョンコントロールのような機能です。LaravelのArtisanコマンドを使用して、データベースへテーブルを追加したりテーブルの定義を変更するマイグレーションファイルを作成できます。この作成したマイグレーションファイルの実行、ロールバック、一括処理をArtisanコマンドで簡単に行うことができるようになっています。
以下のコマンドでマイグレーションファイルのうち、未実行のマイグレーションを全て実行します。

php artisan migrate

以下のコマンドで最後に実行したマイグレーションをまとめて元に戻します。複数のマイグレーションも戻ることになります。

php artisan migrate:rollback

以下のコマンドは全てのマイグレーションをロールバックします。

php artisan migrate:reset

最新の状態にするために一度リセットした後、マイグレーションを実行するとマイグレーションは全てまとめて行われることになります。(ちなみにrefreshで、リセットとマイグレーションを合わせて行うこともできます。)この状態でロールバックすると全てがロールバック対象となります。マイグレーションファイルの名前にはタイムスタンプが含まれていますが、これらに関係なくマイグレーションの実行単位でグルーピングされ、ロールバックはその単位で行われます。

では実際のマイグレーションファイルはどうなっているか見てみましょう。
以下はLaravelのインストール時に追加される、「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
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    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();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
}

upとdownの2つのメソッドで構成され、upメソッドがマイグレーションの実行時の対象メソッドで、downメソッドがロールバックやリセットの対象メソッドになります。こちらを実行すると「users」というテーブルが作成されることになります。ロールバックをすると「users」というテーブルが削除されるという状態になっています。downメソッドではSchemaファサードのdropIfExistsメソッドが設定されています。これは対象テーブルが存在する場合にdropするメソッドですが、Laravelの以前のバージョンではdropメソッドでした。dropメソッドの場合、対象テーブルが存在しないとエラーとなってしまいます。

マイグレーションの実行単位を変更して、特定のマイグレーションをロールバックできるようにする

マイグレーションの実行単位でグルーピングされるのは既に言及していますが、この状態だと特定のテーブルだけ指定してロールバックし、作成しなおすといったことができず不便なことがあります。
この実行単位のグループはテーブルで管理されているため、そのテーブルを更新することでグルーピングの状態を変更することが可能です。その管理テーブルの状態は以下のSQLで確認することができます。

Select * From migrations
Order By batch desc,id;

「migrations」は3カラムのテーブルで「id」がAUTO_INCREMENTの主キー、「migration」がマイグレーションファイル名、「batch」が実行グループを意味するINT型の整数になっています。
1度しかマイグレーションを実行していない場合、batchカラムは「1」のものだけとなります。この状態でマイグレーションを実行するとbatchカラムが「2」、もう一度実行するとbatchカラムが「3」という具合に、マイグレーションの実行単位ごとに数値が振られたレコードが作成されていきます。そしてロールバックはこのbatchの最大値のものが対象となります。
よって特定のマイグレーションをロールバックしたい場合は、その実行マイグレーションのレコードのbatchの値を最大値に更新してから、ロールバックすることで対応することができるのです。

注意事項

こちらの対応方法は正式な手順としてサポートされているものではありません。実際の環境で行う場合は自己責任となりますのでご注意下さい。マイグレーションの順番を強引に入れ替えることになりますので、状態によってはこの操作をするとその環境のマイグレーションの状態に不整合が発生します。我々は良くやっていますが(笑)
ちなみにbatchの値は最大値と記載している通り、連番である必要はないようです。ソースは確認していませんが、現状(Laravel5)はロールバックのときにmigrationsテーブルのbatchカラムの最大値を抽出して対象としているようです。
またmigrationsテーブルのmigrationカラムが対象のマイグレーションファイル名を意味していますので、こちらを間違って変更してしまいロールバックをするとエラーとなります。これは逆にロールバックやリセット前に、マイグレーションファイル名を変更してしまった場合に、ロールバックやリセットを行うとエラーとなる動作と一致します。

まとめ

今回はLaravelのマイグレーションの概要について紹介しました。こちらの機能を非エンジニアが知った時は、管理が相当楽になり非常に便利になる機能だと思いました。実際に使用してみると色々できて本当に便利です。 Laravelを使用している方はこちらのマイグレーションの機能を利用すると色々と捗ると思います。

以上

【関連するリンク】 www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz

【スポンサーリンク】