タイトル通り、特定のWebフレームワークに依存しないPHP製のシンプルなSQLマイグレーションツール「Mig」を作りました。
なぜ作ったのか
大体Webフレームワークにはこの手マイグレーションツールはついていますが、DSLを書かされたり、プログラミング言語の中にSQLを文字列として渡して実行するものが多いです。DSLだと抽象化されている分DB特有の機能が使えなかったり、文字列としてSQLを渡すのはエディタのシンタックスハイライトが使えないのも不便だと考えていました。
そのためマイグレーション用のSQLファイル生成の管理、マイグレーションとロールバックの管理のみを行い、マイグレーションのSQLも直接SQLファイルに書くことができるツールを作りました。
使い方
インストール
composer でglobal installします。
$ composer global require arakaki-yuji/mig
composerでmigがインストールされますので、実行できるように実行パスを通しておきます。
$ export PATH=$PATH:$HOME/.composer/vendor/bin
DBへの接続情報を記載した設定ファイルの設置
プロジェクトのルートディレクトリにmig.config.phpという名前でDB接続情報を記載した設定ファイルを設置します。
<?php return [ 'db_dsn' => '', // example: mysql:host=localhost:3306;dbname=project_db; 'db_username' => '', 'db_passwd' => '', 'migration_filepath' => 'migrations' // directory for place SQL scripts. ];
初期化
設定ファイルが設置されているディレクトリに移動し、初期化コマンドを実行します。
$ mig-cli init
するとマイグレーションの実行履歴を管理するmigrationsテーブルが作成されます。
マイグレーションファイルの作成
mig-cli create [名前]
コマンドを実行すると指定された名前を使ってファイルが2つ作られます。
$ mig-cli create migration-filename Create a new migration file. ================= create migrations/20181121144957_migration-filename.up.sql create migrations/20181121144957_migration-filename.down.sql
up.sql がマイグレーションを実行するときに実行するSQLファイル、down.sqlがマイグレーションをrollabackするときに実行されるsqlファイルです。
たとえば items
というテーブルを作るマイグレーションを作る場合、まずup.sqlファイルにテーブル定義のSQLを書きます。
CREATE TABLE IF NOT EXISTS `items` ( `id` int(11) PRIMARY KEY, `name` varchar(255) NOT NULL );
次にマイグレーションをロールバックする(もとに戻す)ときのためのSQLをdown.sqlに書きます。
DROP TABLE IF EXISTS `items`;
マイグレーションの実行
マイグレーションを実行は以下のコマンドを実行します。
$ mig-cli migrate
これで自分の環境で実行されていないマイグレーションが一度に実行されます。
ロールバックの実行
ロールバックの実行は以下のコマンドを実行します。
$ mig-cli rollback
これで、自分の環境で実行された最新のマイグレーションが一つロールバックされます。
終わりに
もし興味があればぜひ使ってみて、バグあればIssueもください!
あと、何も考えずGithubにそっとスターを押して頂けると嬉しいです笑