Webフレームワークに依存しない、PHP製のシンプルなSQL マイグレーションツール「mig」を作った。

タイトル通り、特定の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にそっとスターを押して頂けると嬉しいです笑