KimuraTweetこんにちは。リスペクトの木村です。以前に書いた記事、「Vagrant環境で実現するお手軽DBマイグレーション」の中で、「Flyway」というJavaで動作するマイグレーションツールをご紹介しました。Flywayは言語やアプリケーションを問わず使えたり、生のSQLクエリで記述するので汎用性が高い点が良かったのですが、別途Javaが必要であるとか、up(マイグレーション)はできてもdown(ロールバック)が出来ないという難点がありました。サイトのリニューアルにあたりマイグレーション周りを整備する必要があったため、難点が解消できるツールを探した所、「Phinx」というマイグレーションツールがありました。使ってみた所非常に良い感じでしたので、今回はそちらをご紹介します。Phinx?PHPで書かれたPHP向けのマイグレーションツールです。0.4.6時点)であれば簡単に使い始める事ができます。Flywayや他のマイグレーションツールと比較してみた特徴はこんな感じです。Serverに対応ちなみに、CakePHP3のマイグレーションにも採用されています。pluginとは互換性が無いという事になります。)導入方法お手元のcomposer.jsonに、次のようにrequire内に追加してinstallを実行するだけです。(*で設定していますが、バージョンなどは環境に合わせて下さい。}}composerコマンド(もしくはcomposer.phar)からでも追加できます。以下にライブラリがインストールされます。initで初期化を行い、phinx.ymlという設定ファイルをを作成します。phinx.ymlにはデータベース接続設定などが保存されます。デフォルトではYAMLで生成されますが、phinx.jsonやphinx.phpというファイルを用意する事でJSONやPHPを生成することもできます。生成されるファイルの中身はこんな感じです。utf8必要に応じ、このファイルの設定内容を手動で変更していきます。paths:migrations:はマイグレーションファイルの保存先を指定します。デフォルトはphinx.ymlのあるディレクトリ(%%PHINX_CONFIG_DIR%%)のmigrationsディレクトリを指しています。マイグレーションファイルの作成時にディレクトリが存在しない場合は作成してくれます。environments:default_migration_tableはマイグレーション情報を管理するテーブル名を設定できます。基本的にはデフォルトで良いのですが、命名ルールにポリシーがある場合など必要に応じて変更しておきます。ちなみに、このテーブルは初回マイグレーション時に勝手に作成されます。お次のenvironments:default_databaseは環境を指定しない場合のデフォルトで使用する環境設定名です。引数でその設定を使用するか指定できますので、変更する必要はありません。environments:productionやenvironments:development・environments:testingは環境毎の接続設定を記述します。この3つしか使えない訳では無いので、設定を追加したり減らしたりする事も可能です。他の設定についてはドキュメントを確認してください。ソケット接続や接続先DBMSに合わせた設定もそこそこ細かく行えるようです。マイグレーションの作成テーブル作成のマイグレーション準備が整ったので、実際にマイグレーションファイルを作成します。マイグレーション名で、マイグレーション名はキャメルケースで指定します。今回はmembersテーブルを作成する、という事にするので、AddMembersTableという名前にしました。AddMembersTableちなみに、マイグレーション名がキャメルケースではなかった場合は、下記のようにExceptionとエラーメッセージが表示されます。format.コマンドを実行するとmigrationsディレクトリの中に日付と時間_マイグレーション名.phpという命名規則で、空のマイグレーションファイルが作成されます。中身は以下のような感じです。}}作成直後はchange()メソッドしかありませんので、基本的にはこの中に記述します。今回はmembersテーブルを作成するので、こんなようになります。}$this->table()でテーブル名を指定してインスタンスを取得し、それに対してaddColumnやaddIndexをして最後にcreate()でテーブルを作成します。addColumnだけでは作成してくれないので注意が必要です。addColumnの関数定義はこのようになっています。array())$columnNameがカラム名、$typeはカラムの種類、$optionsはオプション(サイズやデフォルト値、NULLの許可不許可など)です。カラムのタイプについては後ほど説明します。オプションについては色々あるため、ドキュメントを参照下さい。主キーのカラムは「id」という名前で勝手に作成してくれます。INCREMENT)そのため、addColumnでid名のカラムを作成しようとするとエラーになるので注意が必要です。idが不要な場合は、$this->table()の第二引数に下記のようなオプションを渡します。false));また、主キーを「id」以外の名前にする場合は、上記のfalseを渡している部分を、設定したい名前を渡すようにします。「id」と同じく指定した名前でカラムを作成してくれますので、addColumnは不要です。‘member_id’));changeメソッド内でのテーブル操作は次の関数のみ利用可能です。(他の関数を利用すると、IrreversibleMigrationExceptionの例外がdown時に発生します。)これらを利用して記述する事で、up時やdown時にマイグレーションの内容を自動的に調整して実行します。createTablerenameTableaddColumnrenameColumnaddIndexaddForeignKey例えば、addColumnを使用した場合は、up時にカラムを追加し、down時はカラムを削除する、という動きをしてくれます。カラム操作系ですとaddColumnやrenameColumnの他に、removeColumnというのもあるのですが、これを利用する場合はchangeメソッドが利用できないため、upやdownへ必要な処理を記述する事になります。insertでデータを追加する時や、queryを用いて直接SQLクエリを実行する場合も同様に、upやdownへ必要な処理を記述する必要があります。カラム追加のマイグレーションお次はカラムを追加してみます。UUID用のカラムを追加する、という事で進めます。マイグレーションファイルの名前は、ベタベタにAddUuidColumnAtMembersTableに。AddUuidColumnAtMembersTable中身はこうなります。テーブル作成時とあまり変わらない感じです。}最後のcreate()がsave()になってますが、save()は保存用のメソッドです。テーブルの有無をチェックして、無い場合はテーブルを作成してくれます。なると、先ほどのテーブル作成時もcreate()ではなくsave()で良いのですが、ここでは分かりやすくするため使い分ける事にします。カラムの種類カラムは下記のようなタイプに対応しています。bigintegerbinarybooleandatedatetimedecimalfloatintegerstringtexttimetimestampuuidMySQLの場合、上記に加えてenumとsetにも対応しています。オプションを指定しない場合の、MySQLとの対応表は下記のような感じです。rollback記述もできた所で、マイグレーションを実行します。migrateで実行しますが、そのままですとenvironments:default_databaseの環境で実行されるため、-eオプションで環境を指定します。development環境に対して実行する場合は下記のような感じです。development実行するとこんなログが流れます。0.0198s確認すると、確かにテーブルが作成されています。sec)ちなみに、phinxlogはマイグレーション情報管理のテーブルです。ロールバックは下記のように実行します。development実行時のログはこんな感じで、AddUuidColumnAtMembersTableが戻ります。0.0152s実行後に確認すると、UUIDカラムが無くなりました。0.0104sテーブルが無くなりました。sec)migrate/rollback共に-tオプションで対象のバージョン(マイグレーションファイル名先頭の日付の部分)を指定できます。0で全てのバージョンをロールバックして初期の状態に戻します。statusstatusコマンドを使用する事で、現在のマイグレーションの状態を確認する事ができます。AddUuidColumnAtMembersTable全てロールバックした後ですので、「Status」が全てdownになっています。再度マイグレーションすると、全てupになっています。AddUuidColumnAtMembersTableまとめここまでPhinxのご紹介でした。コマンド数も少なく覚えやすいですし、自動判定のおかげでマイグレーションを書く時間が少なくなりましたので良い感じに運用できています。大体のフレームワークにはマイグレーションが標準機能やプラグインとして提供されていますので出番は少ないかもしれませんが、「あまり合わないので代替えのものを使いたい」という時や「オレオレフレームワークやベタで書いていたりして、そもそも付いてない」という時に選択肢の一つに入れてみてはいかがでしょうか。Composerで入れられますので、どんな環境でもスムーズに導入できるはずです。navigationFuelPHPのマイグレーションについてCakePHPとキャッシュのいろいろについて株式会社リスペクトという、仙台・東京に拠点を持つ会社のシステム部門のブログです。プログラミングやシステム運用のノウハウなどを公開していきます。