プリザンターでER図を作成する③＜スクリプト実行編＞

本記事は、[OSSのノーコード・ローコード開発ツール「プリザンター」 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pleasanter) の24日目の記事です。

## 概要
データベース情報からスキーマ定義やER図を出力してくれる [SchemaSpy](https://schemaspy.org/) を使ってプリザンターのER図を作成します。最終的にプリザンターから以下のようなER図を作成することを目指します。

SchemaSpyの出力イメージ（ER図）
https://implem.github.io/PleasanterERD/schemaspy/relationships.html

本記事は全3回に分けて連載予定の第3回（最終回）となります。今回はプリザンターの画面上のテーブル単位でER図を作成します。

### 試した環境
プリザンター 1.3.27.0（2022/12/23時点の最新版）
OS: Windows10
DB: SQL Server 2019 Express Edition (64-bit)

### はじめに
プリザンターの画面上のテーブル単位でER図を作成したいので、プリザンターのSitesテーブルに格納されている定義情報を読み込んでER図作成用の中間テーブル（PleasanterERDテーブル）を作成し、これをSchemaSpyにインプットとして与えます。

### 事前準備
前回までの記事を参考にプリザンターとSchemaSpyの準備を行ってください。

https://qiita.com/implem-noro/items/207032e885c3f242d486

https://qiita.com/implem-noro/items/a829bfb1fcfbaeb66ef2

### 作成手順
#### 1. PleasanterERDデータベースの作成

SQL Server Management Studio (SSMS) を利用してPleasanterERDデータベースを作成します。

:::note warn
データベース「Implem.Pleasanter」を誤って操作しないように注意してください。念のためバックアップを取得してから作業を行うことをお勧めします。
:::

オブジェクトエクスプローラーよりデータベースを右クリックし、「新しいデータベース」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/844f4e5c-0062-e7d5-bab3-c2b81da4c938.png)

新しいデータベースを作成するためのダイアログが表示されるので、データベース名に「Implem.PleasanterERD」と入力してOKボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/0001a670-5cdd-e289-30c6-7e392d5ed1a7.png)

PleasanterERDデータベースができたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/b6d0d0e4-aa3d-e65e-6d20-b67bc86ea78f.png)

#### 2. PleasanterERDテーブルの作成

以下のスクリプト「PleasanterERD-TableCreator.ps1」をコピーしてデスクトップなど任意の場所に配置します。

https://github.com/implem-noro/PleasanterERD/blob/main/PleasanterERD-TableCreator.ps1

以下のコマンドを実行し、PleasanterERDテーブルを作成します。

```powershell:実行コマンド
PleasanterERD-TableCreator.ps1
```

:::note warn
PowerShell のスクリプトが実行できない場合は以下の対応を行ってください。[^1]
[^1]: [こちらの記事](https://qiita.com/Targityen/items/3d2e0b5b0b7b04963750)に詳しく記載されています。

<details><summary>Set-ExecutionPolicy による実行ポリシーの変更</summary><div>

```powershell:実行コマンド
PowerShell Get-ExecutionPolicy
Set-ExecutionPolicy RemoteSigned
```

```powershell:実行結果
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.

新しいクロスプラットフォームの PowerShell をお試しください https://aka.ms/pscore6

PS C:\WINDOWS\system32> PowerShell Get-ExecutionPolicy
Restricted
PS C:\WINDOWS\system32> Set-ExecutionPolicy RemoteSigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y
PS C:\WINDOWS\system32>
```
</div></details>
:::

以下のようにコンソールにログが出力されればOKです。

```:実行結果
PS C:\Users\noro> C:\Users\noro\Desktop\PleasanterERD-TableCreator.ps1
外部キーの削除：FK_3_ClassA_2
外部キーの削除：FK_4_ClassA_2
外部キーの削除：FK_7_ClassA_6
～中略～
テーブル削除：2,WBS（Issues_2）
テーブル削除：3,課題管理（Issues_3）
テーブル削除：4,レビュー記録（Results_4）
～中略～
テーブル作成：2,WBS（Issues_2）
テーブル作成：3,課題管理（Issues_3）
テーブル作成：4,レビュー記録（Results_4）
～中略～
データ型の変更：ClassA
外部キーの追加：FK_3_ClassA_2
データ型の変更：ClassA
外部キーの追加：FK_4_ClassA_2
データ型の変更：ClassA
外部キーの追加：FK_7_ClassA_6
～中略～
テーブル列名の変更：2,Id -> ID（IssueId）
テーブル列名の変更：2,Ver -> バージョン（Ver）
テーブル列名の変更：2,Title -> タイトル（Title）
～中略～
テーブル名の変更：2 -> WBS（Issues_2）
テーブル名の変更：3 -> 課題管理（Issues_3）
テーブル名の変更：4 -> レビュー記録（Results_4）
～中略～
PS C:\Users\noro>
```

プリザンターの画面上のテーブル単位でPleasanterERDデータベースに物理テーブルが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/35d5c118-54fc-31c1-e464-99bf0df9d820.png)

#### 3. 日本語フォントのインストール

以下のリンクから日本語フォントをインストールします。

https://moji.or.jp/ipafont/

:::note warn
日本語フォントをインストールしないと出力された文字が文字化けしてお豆腐になってしまったり枠線からはみ出てしまいます。[^2]
[^2]: [こちらの記事](https://dev.classmethod.jp/articles/schemaspy-docker-localize-jp/)に詳しく記載されています。
:::

ダウンロードしたファイルを展開し、「ipdaexg.ttf」を右クリックしてインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/f14140af-4c2b-3919-e7bd-488c3e6498ea.png)

#### 4. SchemaSpyの実行
SchemaSpyで以下のコマンドを実行します。

```bat:実行コマンド
cd C:\SchemaSpy
java -jar schemaspy-6.1.1-SNAPSHOT.jar -t mssql17 -dp mssql-jdbc-11.2.1.jre17.jar -host 127.0.0.1 -port 1433 -db Implem.PleasanterERD -u sa -s dbo -p saのパスワード -o C:/SchemaSpy/output -connprops encrypt\=false -font "IPAGothic" -imageformat svg
```

<details><summary>SchemaSpyの実行結果</summary><div>

```:実行結果
Microsoft Windows [Version 10.0.19042.2364]
(c) Microsoft Corporation. All rights reserved.

C:\Users\noro>cd C:\SchemaSpy

C:\SchemaSpy>java -jar schemaspy-6.1.1-SNAPSHOT.jar -t mssql17 -dp mssql-jdbc-11.2.1.jre17.jar -host 127.0.0.1 -port 1433 -db Implem.PleasanterERD -u sa -s dbo -p saのパスワード -o C:/SchemaSpy/output -connprops encrypt\=false -font "IPAGothic" -imageformat svg
  ____       _                          ____
 / ___|  ___| |__   ___ _ __ ___   __ _/ ___| _ __  _   _
 \___ \ / __| '_ \ / _ \ '_ ` _ \ / _` \___ \| '_ \| | | |
  ___) | (__| | | |  __/ | | | | | (_| |___) | |_) | |_| |
 |____/ \___|_| |_|\___|_| |_| |_|\__,_|____/| .__/ \__, |
                                             |_|    |___/

                                              6.1.1-SNAPSHOT

SchemaSpy generates an HTML representation of a database schema's relationships.
SchemaSpy comes with ABSOLUTELY NO WARRANTY.
SchemaSpy is free software and can be redistributed under the conditions of LGPL version 3 or later.
http://www.gnu.org/licenses/

INFO  - Starting Main v6.1.1-SNAPSHOT on DESKTOP-3FUMCFT with PID 7772 (C:\SchemaSpy\schemaspy-6.1.1-SNAPSHOT.jar started by noro in C:\SchemaSpy)
INFO  - The following profiles are active: default
INFO  - Started Main in 5.278 seconds (JVM running for 6.839)
INFO  - Starting schema analysis
INFO  - Connected to Microsoft SQL Server - 15.00.2095
INFO  - Gathering schema details
Gathering schema details......................................(1sec)
Connecting relationships......................................(0sec)
Writing/graphing summary.INFO  - Gathered schema details in 0 seconds
INFO  - Writing/graphing summary
INFO  - Graphviz renderer set to ':cairo'
.ERROR - dot -Tsvg relationships.real.compact.dot -orelationships.real.compact.svg:
ERROR - dot -Tsvg relationships.real.compact.dot -orelationships.real.compact.svg: (dot.exe:2256): Pango-WARNING **: couldn't load font "IPAGothic Not-Rotated 11", falling back to "Sans Not-Rotated 11", expect ugly output.
～中略～
ERROR - dot -Tsvg _______Results_25__ce04b082.1degree.dot -o_______Results_25__ce04b082.1degree.svg: Warning: cell size too small for content
ERROR - dot -Tsvg _______Results_25__ce04b082.1degree.dot -o_______Results_25__ce04b082.1degree.svg: in label of node 蜍牙ｼｷ莨壹Μ繧ｹ繝茨ｼ?Results_25?ｼ?
.(9sec)
Wrote relationship details of 35 tables/views to directory 'C:\SchemaSpy\output' in 16 seconds.
View the results by opening C:\SchemaSpy\output\index.html
INFO  - Wrote table details in 9 seconds
INFO  - Wrote relationship details of 35 tables/views to directory 'C:\SchemaSpy\output' in 16 seconds.
INFO  - View the results by opening C:\SchemaSpy\output\index.html

C:\SchemaSpy>
```
</div></details>

プリザンターの画面上のテーブル単位でDBドキュメントが作成されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/28e9c69b-71c0-d6bc-fcdd-bcfbbc86928f.png)

画面上部のRelationshipsをクリックすると、ER図が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/f323a44d-db0f-f34a-3cd9-b4aede381658.png)

Diagramsは左上からCompactとLargeが選べます。キー項目に着目して全体を俯瞰したい場合はCompact、各テーブルの詳細項目を確認したい場合はLargeを選ぶのがよさそうですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/4b29c2a5-1d79-832e-1b10-b927a3a31496.png)

以下にSchemaSpyで出力したドキュメント関連ファイルを置いておきました。

https://github.com/implem-noro/PleasanterERD/tree/main/docs/SchemaSpy

### おまけ①
[A5:SQL Mk-2](https://a5m2.mmatsubara.com/)というツールを使うと以下のようなテーブル定義書が作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/ff536fa8-2415-9984-a975-d157261dbbad.png)

なかなか見やすくていい感じですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/9b3ce2fb-8b05-7ead-9b8d-0213dd6b9b83.png)

出力方式はExcelとHTMLが選べるようです。以下にA5:SQLで出力したドキュメント関連ファイル（HTML版）を置いておきました。

https://github.com/implem-noro/PleasanterERD/tree/main/docs/a5sql

### おまけ②
スクリプトをデバッグするときは「Pause」と記載のあるコメント行を解除してコンソールに出力されているログを確認してみると解決につながることがあるかもしれません。

![Animation001.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37295/341f252b-b762-80ac-2aae-e8da079a95ad.gif)

### おわりに
ER図作成用の中間テーブルをつくることでプリザンターからSchemaSpyでDBドキュメントを作成することができました。DBドキュメントの作成を省力化して、ノーコード・ローコード開発ツールのプリザンターをより活用していただけたら嬉しいです。最後までお読みいただきありがとうございました。

## 参考リンク
[- SchemaSpy](https://schemaspy.org/)
[- A5:SQL Mk-2](https://a5m2.mmatsubara.com/)
[- プリザンター ユーザマニュアル - FAQ：プリザンターに設定した日本語の項目名でデータベースのビューを作成する](https://pleasanter.org/manual/faq-japanese-label-text-view)