🚀

schemaspyでER図を自動生成する

2024/12/22に公開

はじめに

ER図があれば、テーブルの関係性が理解しやすいです。
GUIでもER図を生成可能ですが、すべてのテーブルを含めたER図が生成され、いちいちズームして確認しなければなりません。
そこでschemaspyでER図を自動生成させていきます。
schemaspyではDB全体のER図だけではなく、各テーブルのER図も生成してくれます。
確認したいテーブルとリレーション関係のあるテーブルのみなので、関係性が理解しやすいです
このUIを超えるものに今のところ出会えていない。

今回はschemaspyの構築方法、アップロード方法などを紹介していきます

schemaspyのメリット・デメリット

メリット

  • DB全体のER図されている。さらにテーブル単位で個別にER図を生成し、特定のテーブルのリレーション関係のみを追いやすい。
  • ER図のテーブルをクリックすると、テーブルの詳細情報に遷移し、カラムの情報やテーブルのリレーションに基づくER図を確認できる。この操作性が非常によい
  • テーブル一覧から検索して即座に目的のテーブルを見つけることができる
  • Dockerのimageも用意されており、CIでER図生成などが用意。

デメリット

  • 各テーブルのER図を個別に生成するため、ER図生成に時間がかかる。DBが多くなると10minほど時間がかかる。作業しながらER図を生成すれば気にならないが、質が良い代わりに時間がかかるのはデメリット。

Dockerの構築

Dockerを利用してschemaspyを構築します

通常

docker-compose.yml
services:
  mysql:
    container_name: mysql
    image: mysql:8.0
    ports:
      - 3307:3306 
    volumes:
      - hoge-mysql:/var/lib/mysql
    environment:
      MYSQL_DATABASE: DB名
      MYSQL_ROOT_PASSWORD: パスワード
    platform: linux/x86_64 
  ## ER図を生成するコンテナ
  schemaspy:
    container_name: schemaspy
    image: schemaspy/schemaspy:6.2.4 # versionによって対応しているDBが異なるので重要
    volumes:
      - ./etc/docker/schemaspy/schemaspy.properties:/schemaspy.properties # ER図生成の設定ファイル
      - ./etc/docs/er:/output # ER図の出力先
    depends_on:
      - mysql
    environment:
      SCHEMASPY_OUTPUT: /output # ER図の出力先を環境変数 SCHEMASPY_OUTPUT に設定
    platform: linux/x86_64
    profiles:
      - extra # 通常時は起動させない
schemaspy.properties
# DBの種類
schemaspy.t=mysql
# ドライバーを指定。Dockerの場合image内にdriversが用意されており、/driversの場合は自動的に最適なものが選択される。
schemaspy.dp=/drivers
# DBのホスト
schemaspy.host=mysql
# ポート番号
schemaspy.port=3306
# DB名
schemaspy.db=DB名
# 図を生成するためのDBのスキーマ名を指定する。
# MySQLの場合、スキーマ名は通常データベース名と同じ場合が多いですが、異なる場合はここで指定します。
schemaspy.s=DB名
# ユーザー名
schemaspy.u=root
# パスワード
schemaspy.p=パスワード
# ER図の出力先
schemaspy.o=./output

https://schemaspy.readthedocs.io/en/v6.2.0/started.html

環境変数で管理したい場合

docker-compose.yml
services:
  schemaspy:
    container_name: schemaspy
    image: schemaspy/schemaspy:6.2.4
    volumes:
      - ./etc/docker/schemaspy/schemaspy.properties:/schemaspy.properties
      - ./etc/docs/er:/output # ER図の出力先
    depends_on:
      - mysql
    environment:
      DB_HOST: ${DB_HOST}
      DB_PORT: ${DB_PORT}
      DB_NAME: ${DB_NAME}
      DB_SCHEMA: ${DB_SCHEMA}
      DB_USER: ${DB_USER}
      DB_PASSWORD: ${DB_PASSWORD}
      SCHEMASPY_OUTPUT: /output
    volumes:
      - ./schemaspy.properties:/schemaspy.properties
      - ./etc/docs/er:/output
    platform: linux/x86_64
    profiles:
      - extra # 通常時は起動させない

docker compose up実行時にschemaspyを起動させる必要もないので、extra指定しています。

schemaspy.properties
schemaspy.t=mysql
schemaspy.dp=/drivers
schemaspy.host=${DB_HOST}
schemaspy.port=${DB_PORT}
schemaspy.db=${DB_NAME}
schemaspy.s=${DB_SCHEMA}
schemaspy.u=${DB_USER}
schemaspy.p=${DB_PASSWORD}
schemaspy.o=./output

起動コマンドの用意

makefile
gen-er:
	docker compose run --rm schemaspy

ER図生成後にschemaspyは不要なので、--rmオプションで終了させます。

CIでアップロードする

下記のようなworkflowでファイルをアップロードします

name: Upload API Docs to S3

on:
  push:
    branches:
      - main
    paths:
      - "./migration/*.sql" # migrationファイルに変更があったら実行

permissions:
  id-token: write
  contents: read
  actions: read

jobs:
  upload-to-s3:
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout
        uses: actions/checkout@v4.1.7

      - name: Setup MySQL
        run: |
          cp etc/docker/.env.example etc/docker/.env
          docker compose up -d mysql
          docker run --network  jwilder/dockerize -wait tcp://mysql:3306 -timeout 3m
          make migrate

      - uses: aws-actions/configure-aws-credentials@v4.0.2
        with:
          role-to-assume: iamのarnを指定
          aws-region: ap-northeast-1
          role-duration-seconds: 3600
          role-session-name: role名を指定

      - name: Generate ER
        run: |
          make gen-er

      - name: Upload TO s3
        run: |
          aws s3 cp ./etc/docs/er s3:ER図のアップロード先 --recursive --acl public-read
          echo "[ER](s3:s3:ER図のアップロード先)" >> $GITHUB_STEP_SUMMARY

Discussion