laravelでパーティション化されたテーブルのマイグレーションを作成する

laravel5.5でパーティションを用いたテーブルをマイグレーションを用いて作成したく、調査したところをまとめます。

結論から書くと

ないです。公式マニュアルを参考にしますが、ページ内にマイグレーションの仕組みを用いてパーティショニングを用いたテーブルを作成する方法は記載がありません。

ではどうするのか

対応方法がないわけではありません。例えば一種の例としてのマイグレーションファイルを提示しますと


class CreatePartitionedTable extends Migration {

    public function up() {
        Schema::table('partitioned_table', function (Blueprint $table) {
            $ddl = "create table partitioned_table (".
                     "id bigint unsigned not null auto_increment,".
                     "type tinyint unsigned not null,".
                     "created_at timestamp null default null,".
                     "updated_at timestamp null default null,".
                     "primary key(id, type)".
                   ") engine=InnoDB default charset=utf8mb4 collate=utf8mb4_bin".
                   "partition by range(type) ( ".
                     "partition p1 values less than (1) engine=InnoDB,".
                     "partition p2 values less than (2) engine=InnoDB".
                   ")";
            DB::connection()->getPdo()->exec($ddl);
        });
    }

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

カラムなんかは適当です。あとコピペしても動かないかもしれないのでご容赦ください。あくまでイメージでこのような形になります。

ポイントとしてはテーブルを作成する際にマイグレーションのAPIとなっている Schema ファサードを用いる際に table メソッドを用いることです。

通常テーブルを作成する際に用いる Schema::create メソッドを用いてしまうと、そのまま引数で指定しているテーブル名が作成されます。さらに中でテーブルを発行するddlを実行する形になるので、テーブルを二度作成しようとしてしまいマイグレーションに必ず失敗します。

そのため本来はテーブルに対して変更を行う際に用いられている Schema::table メソッドを用いること、更にその中でコネクションを取得してddlを直接発行することで任意のsql文を実行できることを利用しています。

結局クロージャ内部の $table 引数は使用しないので Schema::table メソッドの第一引数であるテーブル名も適当で構わないと思います。あまりきれいではないですが公式でサポートされていないので暫定でこういった形で対応しました。

あまり深くlaravelの内部実装については調べてはいませんが他にも方法はあると思いますが、現状これで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください