ER 図を SchemaSpy で自動生成して圧倒的に効率を上げよう - PostgreSQL 編

Posted: 2020/8/3
DB/
Tool

データベースを設計される際に 1 度は ER 図を作成したことはあると思います。

ER 図は 1 度作って終わりではなく、仕様や機能が変更される度に修正が求められるため、毎回更新作業を行うことがとても面倒に感じた経験もあるのではないでしょうか。

今回は、そんな ER 図をデータベースの情報から自動生成してくれるSchemaSpy というツールと、その使い方をPostgreSQLを例に説明していきます。

SchemaSpy とは

既存のデータベースからテーブルやカラムの情報や、ER 図を HTML で出力してくれる Java 製のツールです。

SchemaSpy

まず SchemaSpy の機能の一部を紹介します。(SchemaSpy sample より)

HTML ファイルで出力されるため、UI 上でテーブルやそのカラムを一覧表示することができます。

schemaspy1

ER 図を見やすく生成してくれます。

schemaspy2

他にも外部キーだけを表示したり、独立したテーブルのみを表示させることなどもできます。

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/postgresqlinit.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 を開いてみましょう。

おそらく以下のようなページが表示されるかと思います。

schemaspy1

タブの Relashionships をクリックすると、以下の表示になるはずです。

schemaspy2

このように、DB の構造をもとにコマンド一つで ER 図などを生成してくれるので、開発の効率を非常に高めることができます。

是非 SchemaSpy をプロジェクトに組み込んで、効率化を図ってください!

それでは 🙌