ブログ


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

こんにちは!エンジニアのRt.Sです。
みなさんは、好きな言葉はありますでしょうか?
私は、”自動生成”という言葉が大好きです。
今回は、DB仕様書を自動生成してくれるSchemaSpyを紹介していきます!
SchemaSpyとは
SchemaSpyとは、データベーススキーマを解析しデータベース構造やリレーションの詳細、ER図をHTML形式のドキュメントとして自動生成してくれるJava製のオープンソースのツールです。
テーブル数が増えてくると管理が煩雑になりがちなところ、ドキュメント生成を自動化して品質を保てるわけですね!
SchemaSpyにはDockerベースとjarベースが存在します。今回はDockerベースを使用してハンズオン形式で簡単な出力まで行なっていきます!
早速使ってみる
実行環境
- M1 Mac
- Docker
- MySQL Ver 8.3.0(Dockerイメージ mysql:8.3.0)
- 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を使用したプロジェクトが多いと思いますし、導入も簡単なのでこれは全プロジェクトに採用してもいいかもですね。
皆さんもぜひ良い”自動生成”生活を送ってください!
株式会社ウイングドアは福岡のシステム開発会社です。
現在、私達と一緒に"楽しく仕事が出来る仲間"として、新卒・中途採用を絶賛募集しています!
ウイングドアの仲間達となら楽しく仕事できるかも?と興味をもった方、
お気軽にお問い合わせ下さい!