schemalexの神機能

この記事はOSS紹介 Advent Calendar 2017 の 5日目の記事です。

schemalexとは

schemalex/schemalex

Generate the difference of two mysql schema

と書いてある通り、2つのMySQLスキーマの差分(ALTER)を表示するプロダクトで、@soh335が中心となって開発をしており、 僕も業務でも使っているのでたまにpatchを送っています。

perlだとSQL::Translator::Diffにあたり、 このschemalexはMySQLにしか対応していないのですが、Go製のプロダクトのためバイナリが提供されているため、コマンドラインツールとして簡単に使えるところがSQL::Translator::Diffより使いやすいと思って気に入っています。

紹介したいこと

@lestrratによる#34 のPullRequestが個人的にライフチェンジングだったので是非紹介させてください。

この機能でできるようになったことはスキーマの比較方法の拡張です。

これまでは以下の用にbefore/afterのsqlを用意して比較していました。

$ schemalex /path/to/before.sql /path/to/after.sql

このPRで以下の3パターンの入力に対応されました。

1. mysqlデータソース

$ schemalex /path/to/file mysql://user:password@tcp(host:port)/dbname

2. gitのコミットハッシュ

$ schemalex local-git:///path/to/repo?file=foo.sql&commitish=deadbeaf /path/to/file

3. 標準入力

.... | schemalex - /path/to/file

何が嬉しいの

例えば、普段業務においてDBのmigrationでgitのコミットハッシュと比較するgit-schemalexGitDDLを使っているのですが、 残念ながらうっかり直接ALTERをしてしまったり、ALTERの途中でFK制約に引っかかったりしてしまい、あるべき状態になんとか戻したくなったりすることがあります。 また、gitlogの任意のバージョンに戻したい場合もあります。

そういった時に下記の用にコマンド一発でalter分を出力できるのです。

schemalex mysql://user:password@tcp(host:port)/dbname /path/to/file > revert.sql

最後に

あんまり必要性にピンと来ないかもしれませんが、手元の環境がーーー!テストデータの入れ直しはしたくなーーーーい!となったときに、助けてくれるツールだと思いますので、 ご活用いただけますと幸いです。

マコピー書いたよ!