Djangoでdjano-extensionsを利用してER図(=ERD)を自動作成する!graph_modelsメソッドの使い方

2021年12月9日Djangoの豆知識db設計,ecr

ER図(=ERD)とは?

ER図とはEntity Relationship Diagramの略で、簡単に言うと「データベース設計を関係が見やすいように図にしたもの」です。

今回はDjangoのDB設計の定義ファイルであるmodels.pyの記述からこれを自動生成してみます!

ERD

課題:Djangoのmodels.pyに書いたDB設計からER図を自動で作成したい!

数個のテーブルしかない段階だとあまり感じないかもしれませんが、テーブルが多くなるに連れて開発チームのみながその関係を把握するのが難しくなります。

そんなときにER図があると助かりますが、設計時に作っていなかったり、後からテーブルを足していったりでちゃんとしたER図がない場合はそこそこあるのではないでしょうか?

それを解消してくれるのが、django-extensionsのgraph_modelsコマンドです。現在の、つまり最新のmodels.pyからER図を自動で生成してくれます。

サンプルコード

Githubにサンプルコードを上げています。以下のコマンドで環境構築できます。

git clone -b django_extensions_model https://github.com/yeconnect/django-baby-starter-template.git
cd django-baby-starter-template
docker compose up

(docker compose upのコマンドは1~2分程度かかります。)

ステップ1:django-extensionsのインストール

サンプルコードの場合は、requirements.txtにdjango-extensionsをすでに入れているので必要ありません。

Dockerを使っていない場合は

pip install django-extensions

が必要ですが、今回は必要ありません。

ステップ2:pygraphvizをインストール

pygraphvizはグラフを書くのに必要なライブラリです。先程のようにrequirements.txtに入れるのですが、それだけでは動きません。なぜならpygraphvizは、pythonではない言語で書かれたGraphvizのラッパーだからです。

サンプルコードのように、まずはDockerfileを以下のようにして、Graphvizをインストールしておく必要があります。

FROM python:3.9

RUN apt-get update -y
RUN apt-get dist-upgrade -y
RUN apt-get install -y build-essential graphviz-dev graphviz pkg-config

このようにDockerfileを書いていれば、requirements.textに書いたpygraphvizを正常にインストールすることができます。

ステップ3:models.pyにDB設計を書く

各自作りたいものを書きます。ちなみにサンプルコードには、todo/models.pyとblog/models.pyの2つがあります。

ステップ4:graph_modelsコマンドを実行する。

準備ができたら、ターミナルで

docker compose run --rm web python manage.py graph_models -a -o erd_of_all.png

とすると↓のようにerd_of_all.pngが作成されました!

erd_of_all.png

ステップ5:graph_modelsコマンドのオプションを深ぼり

先程は graph_models -a -o ファイル名.png でした。これは、すべてのテーブルをグラフにしたものです。「テーブルが多すぎて集中できない!」、「特定のアプリのER図が見たい」という場合もあるかと思います。

特定のアプリ(ここではblogとする)のER図を作成したいときは

docker compose run --rm web python manage.py graph_models blog -o erd_of_blog.png

のように「-a」の部分をアプリ名に置き換えるとできます。

また、結果のファイル名を変更したい場合は、「 -o ファイル名.png」 とすればいけます。

おまけ

ちなみにサンプルコードをdocker compose upして、ブラウザで

http://localhost:4989/erd

http://localhost:4989/blog/erd

http://localhost:4989/todo/erd

にアクセスするとそれぞれ、すべてのER図、blogのER図、todoのER図が表示されるようにしてみました。

ぜひ試して見てください!

こんなER図ではしょぼいという場合

把握しやすくはなったけど今ひとつという場合、PlantUMLファイルにmodels.pyを出力してくれるライブラリdjango-model2pumlがあります。より柔軟に対応できそうですね。

こちらの記事で解説しています。(「Djangoのmodels.pyからPlantUMLを自動で作成する。django-model2puml」)