SchemaSpyで日本語カラム名を含むデータベースからER図を作成

SchemaSpyは、データベースのドキュメント(ER図とテーブル定義)をHTML形式で簡単かつきれいに出力できます。 この記事では、SchemaSpy公式Dockerイメージを日本語化し、Docker環境があれば、ファイルを2つ用意するだけで使えます。
2020.05.07

データアナリティクス事業本部の藤川です。データベースのドキュメントを納品するケースがあると思いますが、皆様はどのツールをお使いでしょうか?私はこれまで、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で使用

SchemaSpyDocker HubにあるSchemaSpyの公式Dockerイメージを使用します。自前で用意しなければならないものは、次の3点です。

  • データベース
  • データベースへの接続情報
  • JDBCドライバー
  1. 作業用ファイルを格納するフォルダを作成してください。任意のフォルダ名で構いません。ここでは、schemaspyとします。この後、次のようなフォルダ構成を準備して行きます。
        schemaspy/ ← 任意のフォルダ名で構いません。
        ├── schemaspy.properties ← データベースへの接続情報
        └── output/ ← ここに、HTMLが出力されます。
            └── index.html

  2. データベースへの接続情報を用意してください。次表は一例です。

    項目名 プロパティ名 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 <パスワード> <パスワード> <パスワード>
  3. 対応しているDBの種類については、この辺りこの辺りで確認しましょう。
    ※最新情報をWebで確認できないのは不便ですよね。また、次のコマンドでも確認できます。

        java -jar schemaspy-6.1.0.jar -dbhelp

  4. schemaspyフォルダ直下にschemaspy.propertiesファイルを作成し、データベースへの接続情報を記述してください。こちらも、任意のファイル名で構いません。後ほど、コマンドライン引数で指定します。

        vi ./schemaspy.properties

    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=<パスワード>

  5. 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

  6. Dockerコンテナを起動します。

        docker run \
            --rm \
            --net=host \
            -v $PWD/output:/output \
            -v $PWD/schemaspy.properties:/schemaspy.properties \
            schemaspy/schemaspy:snapshot

  7. 処理が完了すると、ドキュメントが./outputフォルダに出力されます。index.htmlファイルをブラウザで開いてください。

  8. 出力結果のドキュメントを確認したところ、日本語が豆腐(文字化け)に!

    豆腐

日本語フォントをインストール

SchemaSpyの公式Dockerイメージには日本語フォントがインストールされていませんので、このままでは、日本語テーブル名/カラム名は文字化けしてしまいます。そこで、Dockerfileを用意して、Dockerイメージに日本語フォントをインストールします。ここでは、Google NotoフォントIPAexフォントを試してみました。

  1. schemaspyフォルダ直下にDockerfileファイルを作成します。
    ※ここでは、IPAexフォントを使用するDockerfileファイルのみご紹介します。

        schemaspy/
        ├── Dockerfile ← ここに作成します。
        ├── schemaspy.properties
        └── output/
            └── index.html
        vi ./Dockerfile

    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

  2. Dockerイメージを作成します。

        docker build -t schemaspy/japanese:ipaexg00201 .

  3. Dockerコンテナを起動して、SchemaSpyを実行します。

        docker run \
            --rm \
            --net=host \
            -v $PWD/output:/output \
            -v $PWD/schemaspy.properties:/schemaspy.properties \
            schemaspy/japanese:ipaexg00201

  4. ./outputフォルダの出力結果のドキュメントを確認します。

  5. Notoフォントでは、豆腐が消えましたが、文字列が表の枠をはみ出しています。

    日本語化?
  6. IPAexフォントでは、日本語がきれいに出力されました。さすが、Made in Japan!
    日本語化

さいごに

一度、Dockerイメージを作成すれば、docker runするだけで日本語化されたSchemaSpyを再利用可能です。また、別のデータベースに接続することになっても、Dockerイメージの外部にJDBCドライバーや接続情報を持っていますので、これらを差し替えるだけで簡単に切り替えできます。

  1. 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

  2. 下記のように、使用する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

  3. ./driversフォルダにJDBCドライバーを置くだけで、あらゆるデータベースに接続できます。

フォントのライセンスにご注意ください!

フォントを扱う際に注意しなければならないことは、フォントのライセンスです。商用利用、再配布、二次的著作物に該当しないか等。
OS付属のフォントを使用する場合は、特に注意してください。フォントの字形を用いた画像を第三者に納品する行為が使用許諾されていることをご確認ください。