SchemaSpyで日本語カラム名を含むデータベースからER図を作成
データアナリティクス事業本部の藤川です。データベースのドキュメントを納品するケースがあると思いますが、皆様はどのツールをお使いでしょうか?私はこれまで、EclipseでERMasterを使っていました。
最近、私が気に入っているのはSchemaSpy
です。このツールは、ER図とテーブル定義を一度に出力してくれます。また、HTMLに出力してくれるので、Git等の構成管理ツールで差分を確認し易いというメリットがあります。
ローカルPC環境をできるだけクリーンにしておきたい私としては、Dockerで用意したいところです。ライブラリーをインストールしたり、バージョンが古くてアップデートしたり。納品間際は忙しいため、こういうツールは簡単にセットアップできると嬉しいですよね。
ところが、Docker版SchemaSpy
は日本語対応していないため、日本語テーブル名やカラム名を持つデータベースでは、正しく日本語を出力できませんでした。そこで、SchemaSpy
公式Dockerイメージを日本語化してみることにしました。
Dockerが稼働する環境があれば、ファイルを2つ用意していただくだけですので、是非お試しください。
※SchemaSpy
のご紹介は、SchemaSpyでデータベースのドキュメントを生成してみた、Apache AirflowのER図をSchemaSpyで自動生成するようにしてみたをご覧ください。
対象環境
- Dockerが稼働するWindows/macOS/Linux等のマシン
SchemaSpy
6.1.x ※執筆時点
日本語カラム名を含むデータベースを用意
サンプルで利用できる日本語カラム名を含むデータベースが中々見つかりませんでした。ここでは、日本郵便様謹製の郵便番号データを使用させていただきました。今回は、JDBCドライバーがDockerイメージにバンドルされているPostgreSQL
にテーブルを作成しました。
※カラム名が長すぎて、「表示」が「表」に切り詰められていますが、気にしないでください。
SchemaSpyをDockerで使用
SchemaSpy
はDocker Hub
にあるSchemaSpyの公式Dockerイメージを使用します。自前で用意しなければならないものは、次の3点です。
- データベース
- データベースへの接続情報
- JDBCドライバー
- 作業用ファイルを格納するフォルダを作成してください。任意のフォルダ名で構いません。ここでは、
schemaspy
とします。この後、次のようなフォルダ構成を準備して行きます。schemaspy/ ← 任意のフォルダ名で構いません。 ├── schemaspy.properties ← データベースへの接続情報 └── output/ ← ここに、HTMLが出力されます。 └── index.html
-
データベースへの接続情報
を用意してください。次表は一例です。項目名 プロパティ名 MS SQL Server PostgreSQL Amazon Redshift DBの種類 schemaspy.t mssql05 pgsql redshift ホスト名 schemaspy.host 172.17.0.2 172.17.0.2 examplecluster.*.ap-northeast-1.redshift.amazonaws.com ポート番号 schemaspy.port 1433 5432 5439 データベース名 schemaspy.db Northwind dvdrental dev スキーマ名 schemaspy.s dbo public public ユーザ名 schemaspy.u SA postgres awsuser パスワード schemaspy.p <パスワード> <パスワード> <パスワード> - 対応している
DBの種類
については、この辺りかこの辺りで確認しましょう。
※最新情報をWebで確認できないのは不便ですよね。また、次のコマンドでも確認できます。java -jar schemaspy-6.1.0.jar -dbhelp
-
schemaspy
フォルダ直下にschemaspy.properties
ファイルを作成し、データベースへの接続情報
を記述してください。こちらも、任意のファイル名で構いません。後ほど、コマンドライン引数で指定します。vi ./schemaspy.properties
schemaspy.dp=./drivers schemaspy.o=./output schemaspy.t=pgsql schemaspy.host=172.17.0.2 schemaspy.port=5432 schemaspy.db=dvdrental schemaspy.s=public schemaspy.u=postgres schemaspy.p=<パスワード>
-
Dockerイメージに次の
JDBCドライバー
がバンドルされていますので、指定せずに進めます。・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 -
Dockerコンテナを起動します。
docker run \ --rm \ --net=host \ -v $PWD/output:/output \ -v $PWD/schemaspy.properties:/schemaspy.properties \ schemaspy/schemaspy:snapshot
-
処理が完了すると、ドキュメントが
./output
フォルダに出力されます。index.html
ファイルをブラウザで開いてください。 -
出力結果のドキュメントを確認したところ、日本語が
豆腐
(文字化け)に!
日本語フォントをインストール
SchemaSpy
の公式Dockerイメージには日本語フォントがインストールされていませんので、このままでは、日本語テーブル名/カラム名は文字化けしてしまいます。そこで、Dockerfileを用意して、Dockerイメージに日本語フォントをインストールします。ここでは、Google Notoフォント
とIPAexフォント
を試してみました。
schemaspy
フォルダ直下にDockerfile
ファイルを作成します。
※ここでは、IPAexフォント
を使用するDockerfile
ファイルのみご紹介します。schemaspy/ ├── Dockerfile ← ここに作成します。 ├── schemaspy.properties └── output/ └── index.html
vi ./Dockerfile
FROM schemaspy/schemaspy:snapshot USER root WORKDIR / RUN apk update && \ apk add --no-cache curl fontconfig && \ mkdir download && \ cd download && \ curl -O https://ipafont.ipa.go.jp/IPAexfont/ipaexg00201.zip && \ unzip ipaexg00201.zip && \ mkdir -p /usr/share/fonts/truetype/ipa && \ cp */*ttf /usr/share/fonts/truetype/ipa && \ fc-cache -fv && \ rm -rf download
-
Dockerイメージを作成します。
docker build -t schemaspy/japanese:ipaexg00201 .
-
Dockerコンテナを起動して、
SchemaSpy
を実行します。docker run \ --rm \ --net=host \ -v $PWD/output:/output \ -v $PWD/schemaspy.properties:/schemaspy.properties \ schemaspy/japanese:ipaexg00201
-
./output
フォルダの出力結果のドキュメントを確認します。 -
Notoフォント
では、豆腐
が消えましたが、文字列が表の枠をはみ出しています。 IPAexフォント
では、日本語がきれいに出力されました。さすが、Made in Japan!
さいごに
一度、Dockerイメージを作成すれば、docker runするだけで日本語化されたSchemaSpy
を再利用可能です。また、別のデータベースに接続することになっても、Dockerイメージの外部にJDBCドライバーや接続情報を持っていますので、これらを差し替えるだけで簡単に切り替えできます。
schemaspy.properties
ファイルを複数用意しておいて...schemaspy/ ├── Dockerfile ├── config/ │ ├── schemaspy-mssql.properties │ ├── schemaspy-pgsql.properties │ └── schemaspy-redshift.properties ├── drivers/ │ ├── RedshiftJDBC42-no-awssdk-1.2.41.1065.jar │ ├── mssql-jdbc-8.2.0.jre8.jar │ └── postgresql-42.2.12.jar └── output/ └── index.html
-
下記のように、使用する
schemaspy.properties
ファイルをコマンドライン引数に指定するだけです。docker run \ --rm \ --net=host \ -v $PWD/output:/output \ -v $PWD/drivers:/drivers \ -v $PWD/config/schemaspy-redshift.properties:/schemaspy.properties \ schemaspy/japanese:ipaexg00201
-
./drivers
フォルダにJDBCドライバーを置くだけで、あらゆるデータベースに接続できます。
フォントのライセンスにご注意ください!
フォントを扱う際に注意しなければならないことは、フォントのライセンスです。商用利用、再配布、二次的著作物に該当しないか等。
OS付属のフォントを使用する場合は、特に注意してください。フォントの字形を用いた画像を第三者に納品する行為が使用許諾されていることをご確認ください。