DBのDumpファイルからスキーマクラスを作りたい

Rarmani - Dumpファイルからスキーマクラスを作ってくれるツール

わいとんです。まずはこちらの動画をご覧ください。

要するにこれはDumpファイルの中からCREATE TABLE文を抜き出して、それらを全て Moo basedなスキーマファイルにしてしまうというものです。

インストール方法

まだMetaCPANに上げるようなクオリティではないので、github止まりモジュールとなっています。

そのため、まずは git clone してくる必要があります。

$ git clone https://github.com/ytnobody/Rarmani.git

あとは cpanm 等をつかってインストールすればOK。

$ cd Rarmani

$ cpanm .

無事にインストールが完了すると rarmani コマンドが使えるようになります。

rarmaniコマンドの使い方とオプション

動画でも実際に rarmani コマンドの使い方を解説していましたが、改めて説明しておきますと、概ね以下のような使い方をします。

1
$ rarmani --driver=[ドライバー名] --namespace=[スキーマクラスの名前空間] < [ダンプファイル]

一応、全てのオプションについて解説しておきます。動画に登場しなかったオプションもあります。

  • driver : SQLの構文には細かい方言のようなものがあります。Rarmaniでは、DBMSごとのSQLの方言をdriverというもので吸収しております。現時点では MySQL, Pg, SQLite のいずれかを指定することができます。

  • namespace : 生成されるスキーマファイルの名前空間を指定する必要があります。動画内では MyApp::Schema としていましたが、ご自由に設定していただくとよろしいでしょう。

  • path : スキーマファイルをどのディレクトリに生成するかを指定できます。指定しない場合は現在のディレクトリを基準にスキーマファイルが出力されます。

  • roles : スキーマファイルはMooのクラスとなりますが、各スキーマクラスにて Moo::Role に準拠したロールクラスを複数指定することができます。例えば、DBIx::Mint::TableMoo::Role::ToJSON を指定する、等が可能です。

コードファーストとDBファースト

最近では「コードでスキーマを表現して、それをもとにDBにテーブルをつくる」というアプローチの「コードファースト」が流行しているようです。これ自体は開発速度の向上やDBのバージョニングの観点でメリットがあり、採用できるならしたほうが良いかな、というのが私の意見です。代表的なところですと、TypeScriptにおけるPrismaなどが該当するでしょう。

一方で、既存DBがある(しかも顧客情報満載である)場合やDBが軸となって設計されたシステム等、いつもコードファーストが最善とは言えないだろう、というのもまた私の意見です。その場合は旧来の「DBファースト」を選択せざるを得ません。

RarmaniはDBファーストのアプローチを、もう少し良い開発体験で進められるようにしたい、という思いから開発が始められました。Go言語では結構有名なORMapperであるSQLBoilerから少なからず影響をうけています。

さいごに

Rarmaniはまだまだテストコードが足りず、ドキュメンテーションが貧弱です。ドライバーも3種類しかありません。有志のご協力をいただけるととてもありがたいです。

そして、このエントリはPerl Advent Calendar 2022の10日目のエントリとなります。明日11日目はまだ埋まっていませんが、きっとどなたかPerlに愛のある方が書いてくださるのではないか、と期待しております。