SQL 文から ER 図を自動生成してくれる SchemaSpy を docker-compose でやってみた | ライタス株式会社
お世話になります。 田所です。
弊社は開発をすることは基本はないのですが、データベース周りを扱うことはよくあります。
最近、こんな連絡がありました。
DB設計をしてみたのでテーブル内容、リレーション等不備がないか確認をお願いします。 添付ファイル: DB.sql
添付の中を確認しますと、、
CREATE TABLE product (
category INT NOT NULL, id INT NOT NULL,
price DECIMAL,
PRIMARY KEY(category, id)
) ENGINE=INNODB;
......
...........続く
なるほど、わからん。
SQL文だけではさすがにしんどいですよね。
なのでSQL文からER図を作成してくれるSchemaspyを使ってみました。
どうやらSchemaspyはJavaベースで動いて、MYSQL等のデータベースへアクセスして情報を取得し、最終的なレポートを静的なHTMLで生成してくれるものみたいですね。
手順として以下のような感じになります。
- JavaとMySQLをインストール
- MySQLにSQL文をマイグレート
- Schemaspyを実行
うーん、、、なかなか面倒そうだし、ってことなので使い回しも考えてDocker化しちゃいます!
参考記事
構成
- 構成図
- ファイル構成
SchemaSpy/
├── README.md
├── Dockerfile
├── docker-compose.yml
├── mysql
│ └── table.sql // xxxx.sql と拡張子がsqlになっているSQL文のファイルを配置する
└── output // このフォルダにHTML,CSS,JSが生成される
Dockerイメージにはschemaspy/schemaspy:snapshotのイメージがあるので使いました。
しかし実行の際にmysql-connector-javaのバージョンが低いため失敗するので新しいmysql-connector-javaを入れています。
参考記事: Docker でサクッと MySQL 8 から ER 図を作成する
Dockerfile
FROM schemaspy/schemaspy:snapshot
USER root
RUN apk update && \
apk add mysql-client && \
mkdir -p drivers && \
apk add --update openssl && \
wget -P /tmp https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.16.tar.gz && \
tar xvzf /tmp/mysql-connector-java-8.0.16.tar.gz -C /tmp && \
cp /tmp/mysql-connector-java-8.0.16/mysql-connector-java-8.0.16.jar /drivers/. && \
rm -rf /tmp/mysql-connector-java-8.0.16*
docker-composeは若干の工夫が必要で、 先にschemaspyコンテナが起動するとMySQLへの接続エラーとなるため、 MySQLが正常に接続できるようになるのを確認したらschemaspyコンテナを起動させます。
そのためMySQLコンテナにヘルスチェック項目を、 schemaspyコンテナにはdepends_onでcondition: service_health、 とすることでMySQLのヘルスチェックが成功した後、schemaspyコンテナを起動します。
MySQLコンテナの公式に/docker-entrypoint-initdb.dに.sqlファイルを配置したらこれらをインポートすると書いてあるのでこれを利用してマウントさせています。
docker-compose.yml
version: "2"
services:
db:
image: mysql:8
container_name: "mysql"
volumes:
- ./mysql:/docker-entrypoint-initdb.d
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=SCHEMASPY_DATABASE
ports:
- 3306:3306
healthcheck:
test: mysqladmin ping -h 127.0.0.1 -u root -proot || exit 1
schemaspy:
build:
context: .
container_name: "schemaspy"
environment:
- MYSQL_ROOT_PASSWORD=root
volumes:
- ./output:/output
depends_on:
db:
condition: service_healthy
command: -t mysql -host db:3306 -db SCHEMASPY_DATABASE -u root -p root -s SCHEMASPY_DATABASE
実行
1. mysql フォルダに拡張子が.sql の SQL ファイルを配置する
今回はサンプルとしてMySQL 公式の SQL 文をtable.sqlという名前で配置しています。
※SQL文にはCREATE DATABASE
の記載はせずCREATE TABLE
のみ記載してください。
2. コマンド実行: docker-compose build
mysql-connector-java-8.0.16.tar.gzがリンクぎれになってエラーになった場合は最新のものを取得してください。
参考: https://www.mysql.com/jp/products/connector/
3. コマンド実行: docker-compose up
まずMySQLが立ち上がります。
xxxx@DESKTOP-xxxxx:~/schemaspy$ docker-compose up
[+] Running 2/2
⠿ Container mysql Created 0.1s
⠿ Container schemaspy Created 0.1s
Attaching to mysql, schemaspy
mysql | 2022-01-14 10:29:42+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
mysql | 2022-01-14 10:29:42+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
mysql | 2022-01-14 10:29:42+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.27-1debian10 started.
mysql | 2022-01-14 10:29:43+00:00 [Note] [Entrypoint]: Initializing database files
......
........続く
mysql | 2022-01-14T10:30:00.672640Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
mysql | 2022-01-14T10:30:00.672703Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.27' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
準備ができ、そのまま少し待つとSchemaSpyが起動します。
schemaspy | Using drivers:mysql-connector-java-8.0.16.jar
schemaspy | ____ _ ____
schemaspy | / ___| ___| |__ ___ _ __ ___ __ _/ ___| _ __ _ _
schemaspy | \___ \ / __| '_ \ / _ \ '_ ` _ \ / _` \___ \| '_ \| | | |
schemaspy | ___) | (__| | | | __/ | | | | | (_| |___) | |_) | |_| |
schemaspy | |____/ \___|_| |_|\___|_| |_| |_|\__,_|____/| .__/ \__, |
schemaspy | |_| |___/
schemaspy |
schemaspy | 6.1.1-SNAPSHOT
schemaspy |
schemaspy | SchemaSpy generates an HTML representation of a database schema's relationships.
schemaspy | SchemaSpy comes with ABSOLUTELY NO WARRANTY.
schemaspy | SchemaSpy is free software and can be redistributed under the conditions of LGPL version 3 or later.
schemaspy | http://www.gnu.org/licenses/
schemaspy |
schemaspy | INFO - Starting Main v6.1.1-SNAPSHOT on 28ae269f727b with PID 1 (/usr/local/lib/schemaspy/schemaspy-6.1.1-SNAPSHOT.jar started by root in /)
schemaspy | INFO - The following profiles are active: default
schemaspy | INFO - Started Main in 1.523 seconds (JVM running for 2.257)
schemaspy | INFO - Starting schema analysis
mysql | mbind: Operation not permitted
...................
schemaspy exited with code 0
無事終了したら Ctrl + C でコンテナを終了させます。
^CGracefully stopping... (press Ctrl+C again to force)
[+] Running 2/2
⠿ Container schemaspy Stopped 3.1s
⠿ Container mysql Stopped 2.0s
canceled
4. output フォルダに HTML,CSS,JS が生成される
ホスト側のoutputフォルダにファイルが生成されています!
この中にあるIndex.htmlファイルを開きます。
問題なくみれました!
上にある「Relationships」をからER図を確認してみます。
いい感じにER図作らています!
今回のソースはGitHubにも上げています。
使いまわしが効くので便利です!
ご参考までに!
コメント
コメントを投稿