Docker for Windows でSchemaSpyを実行しER図を出力

ER図って書くの面倒ですよね。
大昔はExcelで何時間もかけて作っていました（高額な専用ツールは支給されなかった）が、後々システムに改修が入った場合また結構な時間をかけて作り直さないといけませんでした。
今更そんな面倒なのやりたくないし時間ももったいないので、DB構造を読み取って自動でER図を出力してくれるツール **SchemaSpy** を使ってみましょう。

#動作環境
- Windows10 64bit
- Docker for Windows
- Windows PowerShell

#Docker for Windowsの導入
Windows10-64bitの環境があれば、Docker for Windowsを導入してそこでSchemaSpyを実行するのが楽。

- Docker for Windowsのインストールプログラム
https://docs.docker.com/docker-for-windows/install/

- インストール手順の解説サイト
http://www.atmarkit.co.jp/ait/articles/1609/01/news053.html

- Windows10搭載の仮想環境「Hyper-V」
インストール後「Hyper-V」を有効にするか聞かれるので「有効にする」を選択（要再起動）

#初期設定
###SchemaSpyのインストール
1. Docker HubのSchemaSpyページにアクセス
https://hub.docker.com/r/schemaspy/schemaspy/

2. ページ内に記述されているプルのコマンドをコピー
`$ docker pull schemaspy/schemaspy`

3. Windows PowerShellを起動（管理者権限でなくて良い）
4. 上の手順でコピーしたpullコマンドを実行
5. 10数秒でダウンロードとインストールが完了するので、以下のコマンドを実行してインストールを確認
`$ docker images`
![image2019-1-7_15-17-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395253/1fb46e1b-9622-7f1c-2b38-a9c8a2d774ad.png)

`schemaspy/schemaspy` がリポジトリ内に確認できればOK

#起動確認
`$ docker run -v --net="host" schemaspy/schemaspy:latest`
※ `latest` はimages出力時の `TAG` 名から

上記のコマンドを実行してSchemaSpyの起動画面が表示されればインストール成功
ただし、ER図の出力には様々なオプションを指定する必要があるため、次の項目でそれを説明する。
![image2019-1-7_15-41-35.png](https://qiita-image-store.s3.amazonaws.com/0/395253/be34a043-4bb0-f37c-8ef3-27dd9cbf0111.png)
#ER図の出力
####1. ディレクトリのマウント
ER図はSchemaspy実行時に生成されるコンテナの `/output` ディレクトリに出力される。
このままではPCからER図を閲覧できないため、 `-v` オプションでDocker上のコンテナに
PCのフォルダをマウントして、ファイルを取り出せるようにしなければならない。
例：`-v "[C:\任意のフォルダ]:/output"`　※「:」(コロン)でPCとコンテナを区切る
※ `-v` オプションは複数指定可能

####2. JDBCドライバのパス指定
DBに接続して各テーブルからER図を出力する為には、DBに対応したJDBCドライバが必須となる。
`-dp` オプションでそのドライバの格納場所を指定するが、Windowsのフォルダはパスに指定できないため
`-v` オプションでマウントして、Docker上のコンテナから読み込ませなければならない。
　例：`-v` `"C:\[任意のフォルダ]:/[Docker上の任意のディレクトリ]"`

####3. アクセス権
マウントしたWindowsのフォルダにアクセスするため、初回実行時はDocker for WindowsからPCのログイン情報入力を求められる。
入力が完了するとER図出力処理が続行される。

####4. 各オプションの説明
以下のサイトに各オプションコマンドの解説あり（英語）
http://schemaspy.sourceforge.net/

|パラメータ|説明|例|
|:-----------------|:------------------|:------------------|
| -v|Windows上のフォルダをDocker上のコンテナにマウントするコマンド。「:（コロン）」でWindowsとDocker上のコンテナを区切る|-v "C:\DockerOutput\JDBC:/tmp/jdbc"|
| -t|接続するDBの種類。大文字小文字の区別あり|-t netezza|
|-dp|JDBCドライバのパス。Docker上のコンテナを指定する|-dp "/tmp/jdbc/jdbc.jar"|
|-hostOptionalPort|Netezza指定時とかで必要になるオプション|-hostOptionalPort {サーバーアドレス}:{ポート番号}|
|-db|接続するDBの名前||
|-s|データベーススキーマ||
|-u|DBにログインするユーザーID|-u {DBユーザー名}|
|-p|DBにログインするパスワード|-p {DBユーザーパスワード}|
|-i|ER図を出力するテーブルの名前。正規表現での指定可能|-i "MAKITA_.*"|
|-I|ER図の出力から除外するテーブルの名前。正規表現対応|-I "MAKITA_REJECTTABLE"|
|-charset|文字コード|utf-8|
|-debug|実行時にデバッグログを出力したい場合はこちらを指定||

#出力コマンドのサンプル
`docker run -v "C:\DockerOutput\JDBC:/tmp/jdbc" -v "C:\DockerOutput:/output" --net="host" schemaspy/schemaspy:latest 
-t {DBの種類} -dp "/tmp/jdbc/nzjdbc.jar" -hostOptionalPort {サーバーアドレス}:{ポート番号} -db {DB名} -s "{データベーススキーマ}" -u {DBユーザー名} -p {DBユーザーパスワード} 
-i "T.*" 
-charset utf-8`


#出力結果
- **Tables**
テーブルの一覧

- **Columns**
カラムの一覧
テーブル名など各項目でソート表示可能

- **Constraints**
制約一覧

- **Relationships**
テーブルとの関係図

- **Orphan Tables**
リレーションの無い独立したテーブル

- **Anomalies**
データベースとスキーマに対して「全く正しく」ないかもしれないこと
	- **Columns whose name and type imply a relationship to another table's primary key**  
	名前と型が別のテーブルの主キーとの関係を暗示している列
	- **Tables that contain a single column**  
	単一列を含むテーブル
	- **Columns whose default value is the word 'NULL' or 'null'**  
	デフォルト値が「NULL」または「null」である列
	- **Tables without indexes**  
	インデックスが無いテーブル
	- **Tables with incrementing column names, potentially indicating denormalization**   
	増加する列名(連番が振られている列名？)を持つ表。非正規化を示す可能性がある
- **Routines**
？
**出力イメージ**
![image2019-1-7_20-3-19.png](https://qiita-image-store.s3.amazonaws.com/0/395253/b284e4f7-cc5a-33a3-8b6f-d3ed090d10ce.png)
**リレーションが無い独立したテーブルは図に表示されない**
![image2019-1-7_20-1-10.png](https://qiita-image-store.s3.amazonaws.com/0/395253/210699ce-f640-c7f4-4547-a3d10bdaa43b.png)

#トラブル発生時
上記の出力コマンドでER図は問題無く作成できるはずだが
しばしば「DBに接続できない」や「JDBCドライバが見つからない」等のエラーを吐く。
その場合は以下の手段で解決するかもしれない。

- **Docker for Windowsのリスタート**  
タスクトレイからDocker for Windowsのアイコンを右クリックし `Restart...` を実行
- **資格情報のリセット**  
Windowsのログインパスワードを変更した時などで、Docker内部の資格情報と一致しなくなり  
`-v` オプションによるマウントが出来なくなってしまうことがある。  
その場合は以下の手順で資格情報をリセットし、SchemaSpy実行後に再度権限を与えることで出力が可能になる。
	1. Docker for Windowsのアイコンを右クリックし `Settings` をクリック
	2. メニューから `Shared Drives` をクリックし、その中の `Reset credentials` をクリック
	![image2019-1-7_16-23-13.png](https://qiita-image-store.s3.amazonaws.com/0/395253/fd311632-932e-76d1-7a7b-f98956e4ca69.png)
	3. 再度SchemaSpyを実行するとPCのログインパスワードを求められるので、入力して再度資格情報を付与する。

#公式ヘルプ
英語だけどがんばって読もう。設定するパラメータについて詳しく知れるはず。
https://schemaspy.readthedocs.io/en/latest/index.html