📖

SchemaSpyを使ってER図を自動で作る

2023/10/21に公開

概要

こんにちは。株式会社ポリティブ代表の ysk1o です。
DBのスキーマ定義を開発者で共有したり自分で見たい時に、その可視化の方法に悩んだことのある人は多いのではないかなと思います。マークダウンや手書き?エクセル?などにまとまっている場合も多々あるとは思いますが更新がとても大変(そう)なので、自動で生成するものに頼りたいものです。

そこで今回は弊社プロジェクトにおいて、どのように可視化を行っているかについて記載しようと思います。

前提

  • M1 Macでの開発
  • ProjectにはPostgreSQLを使用している
  • ローカルでER図をサクッと見たい

使用するツール

SchemaSpyは接続するDBのデータからスキーマを読み込み、ER図を作成してくれるJava製のツールです。HTMLで出力されるので、簡単にホスティングすることもできる便利なツールです。

SchemaSpy公式がサンプルのOutputを載せているので紹介します。
(https://schemaspy.org/samples/epivirusurf/)

方針

SchemaSpyのコンテナを作成し、docker-compose.ymlに追加します。同ファイル内で立ち上げているPostgreSQLコンテナのDBを参照するように設定します。

サンプルコード

Dockerfile

ベースイメージにDockerHubではなくECR Publicを使用しているのは、CodeBuildからDockerHubにDocker ImageをPullするときのRate Limitを回避するためです。

参考記事
(https://dev.classmethod.jp/articles/codebuild-has-to-use-dockerhub-login-to-avoid-ip-gacha/)

/schemaspy/Dockerfile
FROM public.ecr.aws/docker/library/amazoncorretto:17-alpine3.18-jdk

ENV DRIVER_URL https://repo1.maven.org/maven2/org/postgresql/postgresql/42.6.0/postgresql-42.6.0.jar
ENV APP_URL https://github.com/schemaspy/schemaspy/releases/download/v6.2.4/schemaspy-6.2.4.jar

WORKDIR /app

RUN apk --update add graphviz ttf-dejavu && \
    apk --update add --virtual .builddep tzdata wget libressl && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    wget -O postgresql-connector-java.jar ${DRIVER_URL} && \
    wget -O schemaspy.jar ${APP_URL} && \
    apk del .builddep && \
    rm -rf /var/cache/apk/*

SchemaSpyの設定ファイル

# DBの種類。MySQLの場合は mysql を指定する
schemaspy.t=pgsql

# JDBCドライバーを指定する
schemaspy.dp=/app/postgresql-connector-java.jar

# DBの接続情報を指定する u: user, p: password
schemaspy.host=postgres
schemaspy.port=5432
schemaspy.db=sample
schemaspy.u=postgres
schemaspy.p=password

# 出力先
schemaspy.o=/output

# 対象のスキーマを指定する
schemaspy.schemas=share,public

docker-compose.yml

docker-compose.yml
version: "3"
services:
  postgres:
    image: public.ecr.aws/docker/library/postgres:14.2
    container_name: "sample_postgres"
    ports:
      - "5432:5432"
    volumes:
      - sample-db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: "password"
+  schemaspy:
+    build: ./schemaspy
+    container_name: "schemaspy"
+    volumes:
+      - ./schemaspy/output:/output
+      - ./schemaspy/config/schemaspy.properties:/app/schemaspy.properties:ro
+    command: "java -jar schemaspy.jar"
+  nginx_schemaspy:
+    image: nginx
+    container_name: "nginx_schemaspy"
+    depends_on:
+      - schemaspy
+    ports:
+      - "8080:80"
+    volumes:
+      - ./schemaspy/output:/usr/share/nginx/html:ro

volumes:
  sample-db:

まとめ

今回は、弊社で取り入れているSchemaSpyの使い方を紹介しました。過去の弊社の事例では、CI/CDにSchemaSpyを組み込みStaging環境や本番環境などのER図をAWSで社内向けにホスティングをしています。

最後まで読んでいただき、ありがとうございました。
参考になったと思った方は是非いいねと、弊社をよろしくお願いします!

Politive Tech Blog

Discussion