🚀
schemaspyでER図を自動生成する
はじめに
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
環境変数で管理したい場合
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