downコマンドがなくupだけのDBマイグレーションツール Dbup
ビー・バップ・ハイスクールって知ってますか? Dカップって大きいですよね?
というわけで、超シンプルなDBマイグレーションツール Dbup を作ってみたので紹介。
特徴
なぜDBマイグレーションツールを作ったか
DBマイグレーションはデプロイ自動化や継続的インテグレーションにおいて一般的に使われるようになってきました。PHPのDBマイグレーションツールとしてはDoctrine2 Migraionがすぐ思い浮かびます。フレームワークに特化したORMの一部として用意されているもの( CakePHP Migrations PluginとかCodeIgniterのマイグレーション )もあったりします。
これらは、ORMの機能の一部だったりするので、ORMの使い方を理解している必要があったり、DSLを覚えたりする必要があったりと手軽さがありません。
DBマイグレーションはDBに対してSQLを発行するのがお仕事なので、アプリの言語とは同じである必要はありません。なので、MyBatis Schema Migration*1 やFlywayのようなツールを使うほうが導入が楽だったり再利用性が高かったりします。
ただ、これでもまだコストが高いと思っています。というのは、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くだしあ
作ってすっきり。