2022年1月17日月曜日

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で生成してくれるものみたいですね。

手順として以下のような感じになります。

  1. JavaとMySQLをインストール
  2. MySQLにSQL文をマイグレート
  3. 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にも上げています。

使いまわしが効くので便利です!


ご参考までに!

https://github.com/tadokoroshoma/schemaspy_docker_compose

0 件のコメント:

コメントを投稿