downコマンドがなくupだけのDBマイグレーションツール Dbup

ビー・バップ・ハイスクールって知ってますか? Dカップって大きいですよね?

というわけで、超シンプルなDBマイグレーションツール Dbup を作ってみたので紹介。

インストールから実行までのデモンストレーション

  • dbup.pharをダウンロード
  • 必要なディレクトリや設定ファイルを作成
  • statusで確認しつつ、upで実行

dbup demo from brtriver on Vimeo.

特徴

  • 準備はdbup.pharをダウンロードするだけ
  • up コマンドしかありません。down コマンドは存在しません
  • マイグレーションの記述は親しみあるSQLそのままです。ORMやDSLを新しく覚える必要はありません
  • PHP標準のPDOクラスを利用しています
  • マイグレーションのステータス管理のためにデータベースに専用のテーブルを作る必要がありません
  • 設定ファイルはiniフォーマットです。PHPに依存しない一般的なフォーマットです。
  • PHP5.4以上。5.3.xでは動きません。

なぜDBマイグレーションツールを作ったか

DBマイグレーションはデプロイ自動化や継続的インテグレーションにおいて一般的に使われるようになってきました。PHPのDBマイグレーションツールとしてはDoctrine2 Migraionがすぐ思い浮かびます。フレームワークに特化したORMの一部として用意されているもの( CakePHP Migrations PluginとかCodeIgniterのマイグレーション )もあったりします。

これらは、ORMの機能の一部だったりするので、ORMの使い方を理解している必要があったり、DSLを覚えたりする必要があったりと手軽さがありません。

DBマイグレーションはDBに対してSQLを発行するのがお仕事なので、アプリの言語とは同じである必要はありません。なので、MyBatis Schema Migration*1Flywayのようなツールを使うほうが導入が楽だったり再利用性が高かったりします。

ただ、これでもまだコストが高いと思っています。というのは、DBマイグレーションというとスキーマのバージョンをUpしたりDownしたり、または特定の時点のバージョンに戻したりというのができて幸せ!ということができるようになっているのですが、事実上Downや特定のバージョンにマイグレーションツールを使って安全に戻せることはとても至難だと思います。

たとえば、カラムを追加しデータがその新しいカラムに追加された時点でDownを実行してデータを消していいかどうかは場合によると思いますし、実際はアプリケーションもあわせてロールバックしなくてはならない場合もあります。

ソースコードと違い、DBマイグレーションは常に歴史を進めていく(Upしつづける)のも運用方法の1つだと考えます。
もし、Upして何か問題が発生した場合も、新しくSQLを用意しそのSQLを発行することで修正を行う方法です。

そして、このようにUpだけできれば良いシンプルなマイグレーションツールが無く、あれば良いよなぁってことで作ってみました。

ドキュメントに書いてないこと

  • 当たり前ですが、フレームワークとか全く関係なく、使いたいときに使えます。
  • PHP環境であれば、他言語のプロジェクトでも使えます。たまたまたPHPで書かれてるだけです。PDOのドライバが対応していれば大丈夫(なはず)
  • githubからcloneしてきて適当にカスタマイズし、php dbup compile すれば俺マイグレーション作れます
  • 実装は Symfony Component の Consoleですので、Symfonyのコマンドの一部として作り込むなんてのも簡単
  • 「とりあえず作ってみた」感が強いので、実プロジェクトで使うときは要注意です。(dev環境やpre環境など本番とは別環境で十分確認できるようになっている等)
  • バグ見つけたらPull Requestくだしあ

作ってすっきり。