SchemaSpyでER図を生成する
データベースのマイグレーションを積み重ねていくようなアプリケーション開発だと、マイグレーションに合わせてER図を手作業でメンテナンスしていくというのは困難です。
ER図と実際のデータベース定義が乖離してしまう危険性もあります。
そのため、マイグレーション後のデータベースからER図を作って参照するような形をとることが(個人的には)ほとんどになっています。
ツールとしてSchemaSpyを使っています。とても便利です。
SchemaSpy とは
データベースの情報を元に、ER図やテーブル、カラム一覧などの情報をHTML形式のドキュメントとして出力するツールです。
下記のようなER図が生成されます。
(以下は手元で適当に作ったテーブル群に対してかけたもの)
他にどんなドキュメントが生成されるかは、公式サイトのサンプルを見るとイメージしやすいと思います。
事前準備
実行するにあたって、下記を準備する必要があります。
- SchemaSpyのjarファイル
- Java8以降のインストール
- 対象のDBに応じたJDBCドライバ
- Graphvizのインストール(オプション)
Graphviz or viz.js
SchemaSpyはグラフ生成のために長い間Graphvizを必要としていましたが、最新の6.1.0ではGraphvizは必須ではなくなりました。
vizjs
というオプションを指定することで、埋め込みのviz.jsがされます。
java -jar schemaspy-6.1.0.jar -vizjs
viz.jsの実行にNashornを使っており、Java15でNashornが削除されているため、vizjs
オプションはJava15以降では動きません。
これに対応するため、GraalJSに置き換える計画があるようです。
設定
実行時にはDBに関する情報を指定するのですが、指定方法として設定ファイルとコマンドライン引数の2パターンが提供されています。
今回は設定ファイルで指定してみます。対象のDBはPostgreSQLです。
# type of database. Run with -dbhelp for details
schemaspy.t=pgsql11
# optional path to alternative jdbc drivers.
schemaspy.dp=drivers
# database properties: host, port number, name user, password
schemaspy.host=192.168.33.10
schemaspy.port=5432
schemaspy.db=testdb
schemaspy.u=user1
schemaspy.p=pass1
# output dir to save generated files
schemaspy.o=output
# db scheme for which generate diagrams
schemaspy.s=public
schemaspy.t
で指定しているDBのタイプですが、PostgreSQL11以降はpgsql
ではなくpgsql11
と指定する必要があります。
設定ファイルは実行ディレクトリにschemaspy.properties
としておいておくと、自動で読み込んでくれます。
あと、JDBCドライバはschemaspy.dp
で指定したディレクトリに配置しておく必要があります。
実行
必要なファイルを準備したうえで
$ ls -1R
.:
drivers
schemaspy-6.1.0.jar
schemaspy.properties
./drivers:
postgresql-42.2.23.jar
下記のようなコマンドで実行します。
設定ファイルのschemaspy.s
で指定したディレクトリにドキュメントが生成されます。
java -jar schemaspy-6.1.0.jar -vizjs
なおvizjs
オプションを指定してviz.jsを使いましたが、Graphvizを使った方が処理時間は短くて済んだので、vizjs
オプションで遅すぎると感じた方は、Graphvizをインストールして使うことをおススメします。
手元だと5テーブル程度でviz.jsだと60秒、Graphvizだと10秒でした。
Docker
jarを実行する方法を書いてきましたが、SchemaSpyには公式からDocker Imageが提供されています。(schemaspy.org だとDockerについて書かれて無いので見つけずらい、、)
事前準備が省けるのでとても便利です。
下記のようなコマンドで同じことができます。
sudo docker run -v "$PWD/output:/output" -v "$PWD/drivers:/drivers" -v "$PWD/schemaspy.properties:/schemaspy.properties" schemaspy/schemaspy:latest
JDBCドライバは、Docker Imageに下記が同梱済みなので、もしも下記で足りるならば、/drivers
としてマウントする必要はありません。(6.1.0時点)
- jtds-1.3.1.jar
- mariadb-java-client-1.1.10.jar
- mysql-connector-java-6.0.6.jar
- postgresql-42.1.1.jre7.jar
Discussion