📝

SchemaSpyでER図を生成する

2021/09/06に公開

データベースのマイグレーションを積み重ねていくようなアプリケーション開発だと、マイグレーションに合わせてER図を手作業でメンテナンスしていくというのは困難です。
ER図と実際のデータベース定義が乖離してしまう危険性もあります。

そのため、マイグレーション後のデータベースからER図を作って参照するような形をとることが(個人的には)ほとんどになっています。
ツールとしてSchemaSpyを使っています。とても便利です。

SchemaSpy とは

データベースの情報を元に、ER図やテーブル、カラム一覧などの情報をHTML形式のドキュメントとして出力するツールです。

下記のようなER図が生成されます。
(以下は手元で適当に作ったテーブル群に対してかけたもの)

Diagram

他にどんなドキュメントが生成されるかは、公式サイトのサンプルを見るとイメージしやすいと思います。

事前準備

実行するにあたって、下記を準備する必要があります。

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