SchemaSpy で既存データベースから綺麗なデータベースドキュメント生成

f:id:Naotsugu:20200524170649p:plain


はじめに

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/ でアプリケーションが起動することを確認しておきましょう。

f:id:Naotsugu:20200523221522p:plain

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 を見てみましょう。

f:id:Naotsugu:20200523225056p:plain

一覧は、ExcelやCSVやPDF形式でダウンロードすることもできます。

テーブルのリンクをクリックすれば、テーブルの絡むや、対象テーブルとの関連テーブルをERダイアグラムとして見ることができます。

f:id:Naotsugu:20200524163552p:plain


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

f:id:Naotsugu:20200524163608p:plain


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

f:id:Naotsugu:20200524163629p:plain


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

f:id:Naotsugu:20200524163647p:plain

関連の無い孤立テーブルは隣の「Orphan Tables」のタブで見ることができます。


Redmine のデータベースドキュメント

別の例として、以下で作成した Redmine のドキュメントも見てみましょう。

blog1.mammb.com

この例では 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 のドライバは以下からダウンロードできます。

downloads.mariadb.org

drivers ディレクトリに格納して、先程と同じように実行します。

$ java -jar schemaspy-6.1.0.jar -vizjs


作成された schemaspy/index.html を見てみましょう。

f:id:Naotsugu:20200524165337p:plain

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

f:id:Naotsugu:20200524165445p:plain

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

f:id:Naotsugu:20200524165528p:plain


まとめ

SchemaSpy によるデータベースのドキュメントの生成について見てきました。

簡単な操作できれいなドキュメントが生成できるためおすすめです。

最後になりましたがプロジェクトは以下です。

github.com