Open1
PlantUML + PyCharm でER図作成|draw.ioからの乗り換えメモ

DB構造を考えている際に今まで通りdrawioで図形配置でポチポチ作ろうかとも思ったのですが、UML形式のコードから簡単にER図を作成ができるらしいとの事、せっかくなので試してみました。
備忘録メモです。
環境
pc:MacBook Pro(2019)
os:macos Sequoia
pycharm:Community Edition(2022.2.5)
graphviz: 13.1.0
モデルの前提
今回のER図は、ミニマムで簡易的な電子書籍アプリのデータ構造を想定
sample_er.puml
@startuml
'線の描画方法を直線ではなく直角線へ
skinparam linetype ortho
entity "users(ユーザー情報)" as users {
*id : INT <<PK>>
indication_name : VARCHAR(100)
email : VARCHAR(100)
created_at : DATETIME
updated_at : DATETIME
}
entity "books(書籍)" as books {
*id : INT <<PK>>
title : VARCHAR(200)
publisher : VARCHAR(100)
is_published : INT
read_direction : INT
price : INT
price_tax_inc : INT
delivery_start : DATETIME
delivery_end : DATETIME
page : INT
}
entity "book_purchases(書籍購入履歴)" as book_purchases {
*id : INT <<PK>>
user_id : INT <<FK>>
book_id : INT <<FK>>
title : VARCHAR(200)
purchased_at : DATETIME
amount : INT
}
entity "book_views(書籍閲覧履歴)" as book_views {
*id : INT <<PK>>
user_id : INT <<FK>>
book_id : INT <<FK>>
title : VARCHAR(200)
viewed_at : DATE
pages_viewed : INT
}
' }o--|| の意味:「多:1」リレーション
' } : N側を示す
' o : 外部キー(FK)を持つ「子」側(N側)
' || : 単一側を示す
book_purchases }o--|| users : user_id
book_purchases }o--|| books : book_id
book_views }o--|| users : user_id
book_views }o--|| books : book_id
@enduml
pumlファイル表示方法(pycharm or drawio)
- PyCharm上でプラグイン拡張でのリアルタイムプレビュー
- draw.io上でコード埋込
の2パターンがあります(ざっくり)
PyCharm上でプラグイン拡張でのリアルタイムプレビュー
必要なものは以下の2つです:
- PlantUML Integration(PyCharmプラグイン)
- graphviz(描画エンジン)
導入手順
- PyCharm > Settings > Plugins >
PlantUML Integration
をインストール+有効化 -
$ brew install graphviz
(※Homebrewが入っている前提) -
$ dot -V
でGraphvizのバージョンが表示されるか確認 -
.puml
ファイルを作成すれば、画面分割でリアルタイムプレビューが表示される
プレビュー画面例
draw.io上でコード埋込
- draw.io を開く
- 「配置 > 挿入 > 高度な設定 > UMLを埋め込む」を選択
注意点
- draw.io のUMLエンジンは PlantUMLのごく一部構文にのみ対応しています
- そのため PyCharm上では表示されるが draw.ioではエラーになることがある
- 結論:PlantUMLのフル構文を使いたいなら PyCharm + Graphvizがベスト
リレーション定義周りの記法が最初分かりづらかったのですが、それさえ分かればそれっぽいER図が簡単に作成できるのでdrawioで図形を配置して手作りするより簡単ですね、修正もコードを調整するだけなので。
もうER図をdraw.ioで手作業で作るのはやめます。修正も再利用も圧倒的にPlantUMLが楽でした。