できる! Phinx

CakePHP3でも採用されるというDBマイグレーションツール "Phinx" について、CakePHP3の前にフライングで使い始めたので紹介します。

Phinxって何?

https://phinx.org/

PHPのDBマイグレーションツールです。CakePHP2だと CakeDC/migrationsが が有名です。

Phinxの特徴としては

などでしょうか?

Cake Bakerにとっては「CakePHP3で採用される」というメリットもあります。

インストール

おすすめはComposer一択です。それ以外の方法は面倒そうなんで割愛します。

{
  "require": {
    "robmorgan/phinx": "*"
  },
}

データベース接続設定 phinx.yml を作成

$ ./vender/bin/phinx init .

でphinx.ymlの雛形を作成し、設定を記述していきます。

paths:
    migrations: %%PHINX_CONFIG_DIR%%/migrations

environments:
    default_migration_table: phinxlog
    default_database: development
    production:
        adapter: mysql
        host: localhost
        name: production_db
        user: root
        pass: ''
        port: 3306
        charset: utf8

    development:
        adapter: sqlite
        name: %%PHINX_CONFIG_DIR%%/../data/var/mysqlitedb
        charset: utf8

    testing:
        adapter: sqlite
        memory: true

%%PHINX_CONFIG_DIR%% はphinx.ymlがあるディレクトリを指します。

マイグレーションファイルは migrations: %%PHINX_CONFIG_DIR%%/migrations に保存されていきます。

マイグレーションファイルを作成する

まずマイグレーションファイルの雛形を作成します。usersテーブルを作成したいので AddUser としました。これはクラス名に関係するのでキャメルケースで指定しましょう。

$ ./vender/bin/phinx create AddUsers

これでmigrationsディレクトリに空のマイグレーションファイルが作成されます。

この中に実際にusersテーブルを作成する記述をします。

<?php

use Phinx\Migration\AbstractMigration;

class AddUsers extends AbstractMigration
{
    /**
     * Change Method.
     *
     * More information on this method is available here:
     * http://docs.phinx.org/en/latest/migrations.html#the-change-method
     *
     */
    public function change()
    {
        $table = $this->table('users');
        $table->addColumn('username', 'text')
              ->addColumn('password', 'text')
              ->addColumn('role', 'text')
              ->addColumn('created', 'datetime')
              ->addColumn('modified', 'datetime')
              ->addColumn('deleted', 'datetime')
              ->create();
    }

    /**
     * Migrate Up.
     */
    public function up()
    {
    }

    /**
     * Migrate Down.
     */
    public function down()
    {
    }
}

マイグレーションを実行する

phinx.yml の development 環境設定に対してマイグレーションを実行したいときは以下のようなコマンドで可能です。

$ ./vender/bin/phinx migrate -e development

ロールバックをするときは

$ ./vender/bin/phinx rollback -e development

で1つづつロールバックされます。一気に最初に戻したいときは

$ ./vender/bin/phinx rollback -e development -t 0

とターゲットバージョンを指定すれば一気に戻せます。

ターゲットバージョンについて

ターゲットバージョンはマイグレーションファイルに自動で設定されるタイムスタンプになります。

マイグレーションロールバックマイグレーションファイル内のup()、down()、change()の関係

Phinxでは基本的にup()マイグレーション用のコードを、down()ロールバック用のコードを書くことを求められます。

1点だけ例外があって、change() に適切な形でマイグレーション用のコードを書くと、down()を書かずにロールバックをすることができます。

ただ、change() で使うことができるメソッドは限定されていて、2014年11月現在は以下に制限されています

Phinx can only reverse the following commands:

  • createTable
  • renameTable
  • addColumn
  • renameColumn
  • addIndex
  • addForeignKey

remove系がないですね。。

ところで、なぜ今Phinxを採用したのか?

Sqliteに対するテストが書かれていたこと」「今後、CakePHP3で採用されること」が理由です。

というわけで

深遠なる理由で、CakeDC/migrationsが 使えない時は検討してみては?