できる! Phinx
@hamaco フライングでPhinxだけ使い始めましたけど、普通にいい感じです。
— k1LoW (@k1LoW) 2014, 11月 25
CakePHP3でも採用されるというDBマイグレーションツール "Phinx" について、CakePHP3の前にフライングで使い始めたので紹介します。
Phinxって何?
PHPのDBマイグレーションツールです。CakePHP2だと CakeDC/migrationsが が有名です。
Phinxの特徴としては
- フレームワークに依存していない
- 軽量
- ORMが使えるので記述がわかりやすい
などでしょうか?
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が 使えない時は検討してみては?