Liam ERD はER図の自動生成ツールで、 PostgreSQL, MySQL (tbls), Prisma, Ruby on Railsなど様々なフォーマットに対応しています。(対応状況) GitHub Trending でも上位にランクインしており、 リリースから3ヶ月で3,000スターを超えるなど注目を集めています。
本記事では、Ruby on Railsプロジェクトで schema.rb
からER図を生成する方法を紹介します。
今回作成したサンプル
サンプル用に適当なスキーマをLLMに生成してもらいました。
# schema.rb
create_table "owners", force: :cascade do |t|
t.string "name", null: false
t.string "email", null: false
t.string "phone"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["email"], name: "index_owners_on_email", unique: true
end
# 以降、テーブル名のみ表記
create_table "animals", force: :cascade do |t|
end
create_table "appointments", force: :cascade do |t|
end
create_table "vaccinations", force: :cascade do |t|
end
create_table "clinics", force: :cascade do |t|
end
create_table "vets", force: :cascade do |t|
end
create_table "visits", force: :cascade do |t|
end
add_foreign_key "animals", "owners"
add_foreign_key "appointments", "animals"
add_foreign_key "vaccinations", "animals"
add_foreign_key "vets", "clinics"
add_foreign_key "visits", "animals"
add_foreign_key "visits", "vets"
このスキーマから次のコマンドでER図を生成します。
npx @liam-hq/cli erd build --format schemarb --input schema.rb --output-dir dist
生成されたER図は以下のようになります。インタラクティブに操作できるので、マウスオーバーで関連するテーブルを表示したり、テーブルをクリックして詳細を確認したりできます。
導入手順
Dockerコンテナ内で schema.rb
からER図をビルドし、http-server
で配信する方針で進めます。
Dockerfile
# Dockerfile
FROM node:22-slim
WORKDIR /app
ARG LIAM_VERSION=0.5.5
RUN npm install @liam-hq/cli@${LIAM_VERSION} http-server
COPY db/schemas/schema.rb .
RUN npx @liam-hq/cli@${LIAM_VERSION} erd build \
--format schemarb --input schema.rb --output-dir dist
Docker Compose
Docker Composeでコンテナ起動時にhttp-server
を実行し、ER図を配信しています。
http-server
はデフォルトでCache-Controlヘッダが付いているので、-c-1
オプションを指定してキャッシュを無効化する必要がありそうです。
また、schema.rb
からホットリロードできるように、Docker Compose Watch の設定 (develop
セクション ) を追加しています。
この設定により、schema.rb
を変更を検知してコンテナが再ビルドされ、ER図が自動生成されます。
# compose.tools.yaml
services:
liam:
build:
context: .
dockerfile: Dockerfile
command: npx http-server --port 1234 dist -c-1
ports:
- 1234:1234
develop:
watch:
- action: rebuild
path: schema.rb
コンテナの起動
Makefile
に起動用のコマンドを追加しています。
今回作成したコンテナを含むツール用のコンテナは compose.tools.yaml
にまとめており、
-p tools
のように別のプロジェクト名を指定することで他のコンテナと分離しています。
# Makefile
tools:
docker compose -f compose.tools.yaml -p tools watch
社内ネットワークで公開
GitHub ActionsでS3にデプロイします。
本プロジェクトでは、Liam ERD以外にも社内用に公開しているコンテンツがあるため、ビルド先をs3_upload/er-diagram
にしています。
name: Deploy Docs to S3
on:
push:
branches:
- develop
permissions:
contents: read
pages: write
id-token: write
env:
LIAM_VERSION: '0.5.5'
OPENAPI_GENERATE_HTML_VERSION: '0.4.3'
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- name: Cache Node.js modules
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ env.LIAM_VERSION }}-${{ env.OPENAPI_GENERATE_HTML_VERSION }}
restore-keys: |
${{ runner.os }}-node
- name: Build Liam ERD
run: |
mkdir -p s3_upload/er-diagram
npx @liam-hq/cli@${{ env.LIAM_VERSION }} erd build --format schemarb --input db/schemas/schema.rb --output-dir s3_upload/er-diagram
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
role-to-assume: arn:aws:iam::${{ secrets.SAMPLE_AWS_ACCOUNT_ID }}:role/sample-github-actions-role
aws-region: ap-northeast-1
- name: Deploy to S3
run: |
aws s3 sync s3_upload/ s3://${{ secrets.SAMPLE_S3_BUCKET_NAME }} --delete
まとめ
本記事では、Liam ERDを試験導入してRuby on Railsプロジェクトの schema.rb
からER図を自動生成する方法を紹介しました。
Dockerを利用した環境構築やホットリロードの設定、GitHub ActionsによるS3へのデプロイ方法についても解説しました。
皆さんのお役に立てれば幸いです。