データベースを設計される際に 1 度は ER 図を作成したことはあると思います。
ER 図は 1 度作って終わりではなく、仕様や機能が変更される度に修正が求められるため、毎回更新作業を行うことがとても面倒に感じた経験もあるのではないでしょうか。
今回は、そんな ER 図をデータベースの情報から自動生成してくれるSchemaSpy というツールと、その使い方をPostgreSQLを例に説明していきます。
SchemaSpy とは
既存のデータベースからテーブルやカラムの情報や、ER 図を HTML で出力してくれる Java 製のツールです。
まず SchemaSpy の機能の一部を紹介します。(SchemaSpy sample より)
HTML ファイルで出力されるため、UI 上でテーブルやそのカラムを一覧表示することができます。
ER 図を見やすく生成してくれます。
他にも外部キーだけを表示したり、独立したテーブルのみを表示させることなどもできます。
PostgreSQL で ER 図生成
それでは実際に PostgreSQL で作ったテーブルから、ER 図を自動生成していきましょう。
環境
使用環境は以下になります。
$ docker -v
Docker version 19.03.13, build 4484c46d9d
Docker で PostgreSQL を起動
まずは Docker で PostgreSQL を起動するためにdocker-compose.yml
ファイルを作成します。
version: "3"
services:
postgresql:
image: postgres:10-alpine
container_name: db-container
ports:
- "5432:5432"
environment:
- POSTGRES_USER=test_user
- POSTGRES_PASSWORD=password
- PGPASSWORD=password
- POSTGRES_DB=test_db
- DATABASE_HOST=localhost
volumes:
- ./db/postgresql:/docker-entrypoint-initdb.d
environment 以下に PostgreSQL のユーザ名、パスワード、DB 名、ホスト名を設定します。また、volumes に sql ファイルを置くパスを設定します。
今回は./db/postgresql
にinit.sql
ファイルを作成します。
SET client_encoding = 'UTF8';
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS tag;
DROP TABLE IF EXISTS menu;
CREATE TABLE IF NOT EXISTS users (
user_id SERIAL NOT NULL,
name VARCHAR(16) NOT NULL,
email VARCHAR(64) NOT NULL,
PRIMARY KEY (user_id)
);
CREATE TABLE IF NOT EXISTS tag (
tag_id SERIAL NOT NULL,
tag_name VARCHAR(64) NOT NULL,
PRIMARY KEY (tag_id)
);
CREATE TABLE IF NOT EXISTS menu (
menu_id SERIAL NOT NULL,
name VARCHAR(256) NOT NULL,
tag_id INT NOT NULL,
user_id INT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (tag_id) REFERENCES tag(tag_id) ON UPDATE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(user_id) ON UPDATE CASCADE,
PRIMARY KEY (menu_id)
);
SchemaSpy の Docker image を利用して ER 図を生成
SchemaSpy には公式のDocker imageがあるので、それを使用します。
以下のコマンドを実行します。
docker run -v "$PWD/schema:/output" --net="host" schemaspy/schemaspy:6.1.0 -t pgsql \
-host localhost:5432 -db test_db -u test_user -p password -connprops useSSL\\=false -all
実行が完了すると schema ディレクトリ以下にファイルが生成されます。
コマンドの説明は以下の通りです。
docker run -v "$PWD/schema:/output" --net="host" schemaspy/schemaspy:6.1.0 -t <SQLの種類> \
-host <ホスト名>:<ポート> -db <DB名> -u <ユーザ名> -p <パスワード名> -connprops useSSL\\=false -all
そして、schema/public/index.html
を開いてみましょう。
おそらく以下のようなページが表示されるかと思います。
タブの Relashionships をクリックすると、以下の表示になるはずです。
このように、DB の構造をもとにコマンド一つで ER 図などを生成してくれるので、開発の効率を非常に高めることができます。
是非 SchemaSpy をプロジェクトに組み込んで、効率化を図ってください!
それでは 🙌