
はじめに
SchemaSpy は、既存のデータベースからデータベースのドキュメントをHTMLで出力するJava製のツールです。
ここでは SchemaSpy の使い方について簡単に紹介します。
データベースの準備
何でもいいのですが、ここでは Spring petclinic を例にしてデータベースドキュメントを生成してみます。
リポジトリから git clone します。
$ git clone https://github.com/spring-projects/spring-petclinic.git $ cd spring-petclinic
Docker で MySql を起動します。
$ docker run -e MYSQL_USER=petclinic -e MYSQL_PASSWORD=petclinic -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=petclinic -p 3306:3306 mysql:5.7.8
起動したら別コンソールでアプリケーションを起動します
$ ./mvnw package $ java -jar -Dspring.profiles.active=mysql target/*.jar
profile に spring.profiles.active=mysql として MySql を指定しています。
http://localhost:8080/ でアプリケーションが起動することを確認しておきましょう。

Spring petclinic アプリケーションが準備できたので、SchemaSpy でデータベースドキュメントを作成していきましょう。
SchemaSpy の準備
データベースドキュメントは SchemaSpy の jar をダウンロードして実行するだけです。
https://github.com/schemaspy/schemaspy/releases からSchemaSpy をダウンロードします。
現時点の最新版は SchemaSpy v6.1.0 となっています。
起動オプションをコマンドラインパラメータで指定することもできますが、schemaspy.properties を準備するのが便利です。
以下のように作成します。
# type of database. Run with -dbhelp for details schemaspy.t=mysql # optional path to alternative jdbc drivers. schemaspy.dp=drivers # database properties: host, port number, name user, password schemaspy.host=localhost schemaspy.port=3306 schemaspy.db=petclinic schemaspy.u=petclinic schemaspy.p=petclinic # output dir to save generated files schemaspy.o=schemaspy # db scheme for which generate diagrams schemaspy.s=petclinic
データベース別の設定は以下のコマンドでヘルプを見ることができます。
$ java -jar schemaspy-6.1.0.jar -dbhelp
例えば Oracle 向けには以下の設定がガイドされます。
INFO - Oracle with OCI8 Driver (-t ora) INFO - -db database name (from TNSNAMES.ORA) INFO - Oracle with Thin Driver (-t orathin) INFO - -host host of database, may contain port INFO - -port optional port if not default INFO - -db database SID as known on host INFO - Oracle with Thin Driver (-t orathin-service) INFO - -host host of database, may contain port INFO - -port optional port if not default INFO - -db database (service) as known on host
Thin Driver の場合には、schemaspy.t=orathin と設定し、schemaspy.db には SID を指定すれば良いことがわかります(Oracle の場合で Catalog name can't be null というエラーが出る場合は schemaspy.cat=% をプロパティファイルに加えます)。
今回は MySQL なので以下に従った定義としています。
INFO - MySQL (-t mysql) INFO - -host host of database, may contain port INFO - -port optional port if not default INFO - -db database name
MySql の JDBC ドライバも入手しておきます。
公式ページからダウンロードしてもいいですが、ここでは Maven リポジトリから直接取得します。
curl -O https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.20/mysql-connector-java-8.0.20.jar
schemaspy.dp で指定した drivers ディレクトリに mysql-connector-java-8.0.20.jar を配備したら準備完了です。
SchemaSpy の起動
ダウンロードした jar を起動するだけです。
$ java -jar schemaspy-6.1.0.jar -vizjs
schemaspy.properties が実行ディレクトリと異なる場所にある場合は、引数に -configFile path/to/config.file のように指定します。
-vizjs は組み込みの viz.js によりERダイアグラムを書く場合に指定します。以前のバージョンでは Graphviz のインストールが必要でしたが、6.1 より組み込みの viz.js でERダイアグラムを表示できるようになりました。
以下のように実行され、schemaspy.properties で指定した出力ディレクトリに HTML が生成されます。
$ java -jar schemaspy-6.1.0.jar -vizjs
____ _ ____
/ ___| ___| |__ ___ _ __ ___ __ _/ ___| _ __ _ _
\___ \ / __| '_ \ / _ \ '_ ` _ \ / _` \___ \| '_ \| | | |
___) | (__| | | | __/ | | | | | (_| |___) | |_) | |_| |
|____/ \___|_| |_|\___|_| |_| |_|\__,_|____/| .__/ \__, |
|_| |___/
6.1.0
SchemaSpy generates an HTML representation of a database schema's relationships.
SchemaSpy comes with ABSOLUTELY NO WARRANTY.
SchemaSpy is free software and can be redistributed under the conditions of LGPL version 3 or later.
http://www.gnu.org/licenses/
...
INFO - View the results by opening schemaspy/index.html
SchemaSpy のドキュメント
作成された schemaspy/index.html を見てみましょう。

一覧は、ExcelやCSVやPDF形式でダウンロードすることもできます。
テーブルのリンクをクリックすれば、テーブルの絡むや、対象テーブルとの関連テーブルをERダイアグラムとして見ることができます。

カラムの一覧を見ることができます。

制約の一覧を見ることができます。

関連テーブルをERダイアグラムとして見ることができます。

関連の無い孤立テーブルは隣の「Orphan Tables」のタブで見ることができます。
Redmine のデータベースドキュメント
別の例として、以下で作成した Redmine のドキュメントも見てみましょう。
この例では mariadb を使っているので、schemaspy.properties は以下のようになります。
# type of database. Run with -dbhelp for details schemaspy.t=mariadb # optional path to alternative jdbc drivers. schemaspy.dp=drivers # database properties: host, port number, name user, password schemaspy.host=localhost schemaspy.port=3306 schemaspy.db=redmine schemaspy.u=root schemaspy.p=redmine # output dir to save generated files schemaspy.o=schemaspy # db scheme for which generate diagrams schemaspy.s=redmine
mariadb のドライバは以下からダウンロードできます。
drivers ディレクトリに格納して、先程と同じように実行します。
$ java -jar schemaspy-6.1.0.jar -vizjs
作成された schemaspy/index.html を見てみましょう。

Redmine は外部キー制約が定義されていないため、テーブル間の関連は表示することができません。

全て孤立テーブルとして表示されます。

まとめ
SchemaSpy によるデータベースのドキュメントの生成について見てきました。
簡単な操作できれいなドキュメントが生成できるためおすすめです。
最後になりましたがプロジェクトは以下です。