smellman's Broken Diary

クソみたいなもんです

schemaspyでRailsのDBの概要の資料を作成する

schemaspyを使ってRailsのDBの資料が簡単に作れたのでネタにしてみます。

github.com

用意するもの docker-compose 環境なんですが、これは Mac上で Graphviz が落ちるというのを回避するためにやっています。

まず docker-compose.yml を用意

version: '3'
volumes:
  pgdata:
services:
  db:
    image: "mdillon/postgis:9.6"
    volumes:
      - pgdata:/var/lib/postgresql/data
      - .:/mydata
    ports:
      - "5432:5432"
  schemaspy:
    image: "schemaspy/schemaspy:snapshot"
    volumes:
      - ./schemaspy:/output
    depends_on:
      - db

自分の場合だいたいpostgisを使っているのでimageはpostgisです。

事前準備はこんな感じ。

pg_dump -Fp -O hogehoge > hogehoge.sql
docker-compose pull
docker-compose up -d db

postgresqlが立ち上がったのでimportします。

docker-compose exec db /bin/bash
su - postgres
createuser -s foo
createdb -O foo bar
psql -U foo bar < /mydata/hogehoge.sql

インポートするときは /mydata にデータがあるようにしてるので注意してください。

あとは schemaspy の volumes に schemaspy というディレクトリを指定してるので、先に作ってから出力します。
ちなみに現状の schemaspy:snapshot は -o オプションが指定されてるので変更はできません。

mkdir schemaspy
docker-compose run schemaspy -t pgsql -host db -db qq -schemas "public" -u qq -charset utf-8 -rails -I "spatial_ref_sys|geography_columns|geometry_columns|raster_columns|raster_overviews"

これで schemaspy/index.html を開けばOK。
なかでは relation の項目でこんな図ができたりします。

f:id:smellman:20171230161522p:plain

オプションの -railsspam_id を spams などにリレーションを貼ってくれるようになります。
あと、 -I オプションで除外できるテーブルを指定できるので postgis のやつらを除外すれば rails のみの構成になります。

注意としては schemaspy は github で開発が継続されてから公式ドキュメントが追いついてないのでソースコード読んだほうが機能が見つけやすいです(ぉ
あと、schemaspy で検索すると sourceforge の方がまっさきに出てくるので渋い気持ちになります。

おまけ

snapshot ではなく schemaspy 6.0.0rc2 を動かしてみたいと思って試しに作った Dockerfile も置いておきますね。

FROM openjdk:8-slim

RUN apt-get update && apt-get install -y --no-install-recommends \
                graphviz \
&& rm -rf /var/lib/apt/lists/*

RUN mkdir /usr/src/app

COPY postgresql-42.1.4.jar /usr/src/app
COPY schemaspy-6.0.0-rc2.jar /usr/src/app

jar は各自拾ってきましょう。