RailsでDB定義書を自動生成

とあるプロジェクトでデータベースのテーブル定義書を作成する必要があったのですが、変更がある度に手動でドキュメントを修正するのは大変面倒なため、自動生成することにしました。
Rails の migration を使って管理しているテーブル群(MySQL)の定義書を PDF で出力するまでのフローを紹介します。
この記事の通りに作成すると以下の様式の定義書になりますが、お好きなようにデザインを変更することもできます。詳細は後述。


全体の流れ

  1. rake db:migrate でテーブルを作成/変更する
  2. DBのスキーマ構造を XML 形式で出力する
  3. XML を HTML に変換する
  4. HTML を PDF に変換する

の大きく4つの手順で定義書を出力します。

1. rake db:migrate でテーブルを作成/変更する

この部分は普段の通りに migration ファイルを記述するだけなのですが、上部サンプルの定義書にあるようにカラムの論理名が必要な場合には、 migration_comments という gem を使います。
以下のように migration ファイルを書くと論理名も記述することができます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class CreateUser < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name, null: false, default: 'No Name', comment: 'ユーザ名'
t.string :email, null: false, comment: 'メールアドレス'
t.string :password, null: false, comment: 'パスワード'
t.integer :age, comment: '年齢'

t.timestamps null: false
end
add_index :users, :email, unique: true
set_table_comment :users, "ユーザ"
set_column_comment :users, :id, "ユーザID"
end
end

レコードIDとテーブル名は set_table_commentset_column_comment を使って別途定義をしています。

2. DBのスキーマ構造を XML 形式で出力する

MySQL の場合には mysqldump コマンドの --no-data --xml オプションでスキーマ情報だけを XML 形式で出力できるため、これを使用します。

3. XML を HTML に変換する

xsltproc というツールを使うと

1
$ xsltproc -o schema.html style.xsl schema.xml

で XML を HTML に変換することができます。XSL は聞いたことがなかったのですが、Extensible Stylesheet Language の頭文字で、XML の変換を行うためのスタイルシート技術のようです。
長くなるのでここには記載しませんが、サンプル定義書で使用した XSL は Gist showwin/db_schema_style.xsl に上げたので必要な方はこちらもご覧ください。

4. HTML を PDF に変換する

wkhtmltopdf というツールを使うと

1
$ wkhtmltopdf schema.html schema.pdf

で HTML から PDF に変換できるのですが、Ubuntu の場合だと wkhtmltopdf: cannot connect to X server とエラーが出てしまうので

1
$ xvfb-run -a -s "-screen 0 1024x768x24" wkhtmltopdf schema.html schema.pdf

とすると良いです。ついでに fonts-ipafont を入れておくとフォントが綺麗になって幸せになれます。

手順まとめ

Rails + MySQL + Ubuntu な環境での手順まとめです。
違う環境のかたは適宜対応してください。

必要なツールをインストールします。

1
$ apt-get install xsltproc xvfb wkhtmltopdf fonts-ipafont

Gemfile に追加します。

1
gem 'migration_comments'

migration ファイルを記述します。

Rakefile に rake db:migration コマンドにフックして2,3,4の処理が実行されるように記述します。中間生成物は home_path/* に出力して、最終成果物のDB定義書は doc/schema.pdf に出力する例です。style.xsl を事前においておくことを忘れないようにしましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
task :create_schema_doc do
home_path = 'path/to/somewhere'
# schema の構造を XML 形式で出力
`mysqldump -u $RAILS_DATABASE_USERNAME -p$RAILS_DATABASE_PASSWORD -h $RAILS_DATABASE_HOST --no-data --xml $RAILS_DATABASE_NAME > #{home_path}/schema.xml`
# XML を HTML に変換
`xsltproc -o #{home_path}/schema.html #{home_path}/style.xsl #{home_path}/schema.xml`
# HTML を PDF に変換
`xvfb-run -a -s "-screen 0 1024x768x24" wkhtmltopdf #{home_path}/schema.html doc/schema.pdf`
end

Rake::Task['db:migrate'].enhance do
Rake::Task[:create_schema_doc].invoke
end

そして、、

1
$ rake db:migrate

でPDFなDB定義書の完成です!

まとめ

Rails でアプリケーションを書いていて、DB定義書が必要になるケースはあまりないかもしれませんが、特に意識することなく rake db:migrate の度に自動でDB定義書が更新されるのが思いのほか気持ちよかったので記事にしてみました。
XML から HTML への変換時の自由度が高く、好みのデザイン/スタイルで出力できるのも魅力的ですね。

このエントリーをはてなブックマークに追加