BLOG

ブログ

2025/03/24 技術系

SchemaSpyでDB仕様書とER図を簡単自動生成!

この記事を書いた人 Rt.S
画像1

こんにちは!エンジニアのRt.Sです。

みなさんは、好きな言葉はありますでしょうか?
私は、”自動生成”という言葉が大好きです。

今回は、DB仕様書を自動生成してくれるSchemaSpyを紹介していきます!

SchemaSpyとは

https://schemaspy.org

SchemaSpyとは、データベーススキーマを解析しデータベース構造やリレーションの詳細、ER図をHTML形式のドキュメントとして自動生成してくれるJava製のオープンソースのツールです。

テーブル数が増えてくると管理が煩雑になりがちなところ、ドキュメント生成を自動化して品質を保てるわけですね!

出力サンプルページ

SchemaSpyにはDockerベースとjarベースが存在します。今回はDockerベースを使用してハンズオン形式で簡単な出力まで行なっていきます!

早速使ってみる

実行環境

  1. M1 Mac
  2. Docker
  3. MySQL Ver 8.3.0(Dockerイメージ mysql:8.3.0)
  4. SchemaSpy(Dockerイメージ schemaspy:snapshot)

1. まずは適当にデータベースを作成する

今回は、Dockerのmysql:8.3.0イメージを使用してコンテナ上にECサイトをイメージしたusers, products, orders, order_itemsの4テーブルを作成しました。

mysql> show tables;
+-----------------------------+
| Tables_in_schemaspy-demo-db |
+-----------------------------+
| order_items                 |
| orders                      |
| products                    |
| users                       |
+-----------------------------+
4 rows in set (0.01 sec)

それぞれのテーブルスキーマは下記となっています。

usersテーブル

mysql> show columns from users;
+------------+--------------+------+-----+-------------------+-------------------+
| Field      | Type         | Null | Key | Default           | Extra             |
+------------+--------------+------+-----+-------------------+-------------------+
| user_id    | int          | NO   | PRI | NULL              | auto_increment    |
| username   | varchar(50)  | NO   |     | NULL              |                   |
| email      | varchar(100) | NO   | UNI | NULL              |                   |
| created_at | timestamp    | YES  |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+------------+--------------+------+-----+-------------------+-------------------+
4 rows in set (0.01 sec)

productsテーブル

mysql> show columns from products;
+--------------+---------------+------+-----+-------------------+-------------------+
| Field        | Type          | Null | Key | Default           | Extra             |
+--------------+---------------+------+-----+-------------------+-------------------+
| product_id   | int           | NO   | PRI | NULL              | auto_increment    |
| product_name | varchar(100)  | NO   |     | NULL              |                   |
| price        | decimal(10,2) | NO   |     | NULL              |                   |
| created_at   | timestamp     | YES  |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
+--------------+---------------+------+-----+-------------------+-------------------+
4 rows in set (0.01 sec)

ordersテーブル

mysql> show columns from orders;
+--------------+---------------+------+-----+-------------------+-------------------+
| Field        | Type          | Null | Key | Default           | Extra             |
+--------------+---------------+------+-----+-------------------+-------------------+
| order_id     | int           | NO   | PRI | NULL              | auto_increment    |
| user_id      | int           | NO   | MUL | NULL              |                   |
| order_date   | timestamp     | YES  |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
| total_amount | decimal(10,2) | NO   |     | NULL              |                   |
+--------------+---------------+------+-----+-------------------+-------------------+
4 rows in set (0.00 sec)

order_itemsテーブル

mysql> show columns from order_items;
+---------------+---------------+------+-----+---------+----------------+
| Field         | Type          | Null | Key | Default | Extra          |
+---------------+---------------+------+-----+---------+----------------+
| order_item_id | int           | NO   | PRI | NULL    | auto_increment |
| order_id      | int           | NO   | MUL | NULL    |                |
| product_id    | int           | NO   | MUL | NULL    |                |
| quantity      | int           | NO   |     | NULL    |                |
| price         | decimal(10,2) | NO   |     | NULL    |                |
+---------------+---------------+------+-----+---------+----------------+
5 rows in set (0.01 sec)

2. SchemaSpyを導入する

1. compose.yamlを修正する

dbコンテナを記述していたcompose.yamlにschemaspyコンテナの記述を追加します。

services:
  db:
    # dbコンテナの記述
    # ...
  schemaspy:
    image: schemaspy/schemaspy:snapshot
    volumes:
      - ./schemaspy/output:/output
      - ./schemaspy/schemaspy.properties:/schemaspy.properties
    depends_on:
      - db

2. schemaspy.propertiesを作成する

プロジェクトディレクトリ配下にschemaspyディレクトリを作成して、配下にschemaspy.propertiesファイルを作成し下記を記述します。

# type of database. Run with -dbhelp for details
# if mssql doesn't work: try mssql08 in combination with sqljdbc_7.2, this combination has been tested
schemaspy.t=mysql
# optional path to alternative jdbc drivers.
#schemaspy.dp=path/to/drivers
# database properties: host, port number, name user, password
schemaspy.host=db
schemaspy.port=3306
schemaspy.db=schemaspy-demo-db
schemaspy.u=user
schemaspy.p=password
# output dir to save generated files
schemaspy.o=/output
# db scheme for which generate diagrams
schemaspy.s=schemaspy-demo-db

このファイルをschemaspyのコンテナの/schemaspy.propertiesにマウントしています。

記述の説明

schemaspy.dpはJDBC ドライバを指定する項目なのですが、Dockerイメージを使用する場合、既に内包されており記述は不要のためコメントアウトしています。

# optional path to alternative jdbc drivers.
#schemaspy.dp=path/to/drivers

schemaspy.hostには、データベースのホストを指定します。コンテナで起動しているのでコンテナ名dbを指定します。

schemaspy.host=db

schemaspy.oは、出力ファイルのアウトプット場所を指定します。今回は、コンテナ内の/outputに指定し、先で記述したcompose.yamlで/outputをホストの./schemaspy/outputにマウントしています。

schemaspy.o=/output

その他の項目は、環境に合わせて適宜修正をお願いいたします。

最終的なディレクトリ構成

.
├── compose.yaml
├── docker
│     └── mysql
│          ├── Dockerfile
│          ├── data
│          └── my.cnf
└── schemaspy
     ├── schemaspy.properties
     └── output

3. 出力する

あとはコンテナを再起動するだけで完了です!簡単ですね。

docker compose up -d

schemaspy/outputディレクトリにファイル群が自動生成されています。index.htmlをブラウザで開いてみると綺麗な仕様書が確認できます!

usersテーブルを見に行くとER図のリレーションも確認できますね!

使ってみて

出力されたファイルをGitHub Pagesとかで限定公開しておけばコードとセットで管理することができ便利そうです!昨今、Dockerを使用したプロジェクトが多いと思いますし、導入も簡単なのでこれは全プロジェクトに採用してもいいかもですね。

皆さんもぜひ良い”自動生成”生活を送ってください!



株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!

アーカイブ