SchemaSpyとは

各種データベースのスキーマ情報を静的HTMLファイルに書き出すJava製のコマンドラインツールです。内部でGraphvizを使用してテーブルのリレーション図を出力する機能があるのが特徴です。
面白いのは、外部制約を設定していなくても、プライマリーキーが設定してあるカラムについて、カラムのデータ型、データ長を元に他のテーブルのカラムと外部キーが設定してあるかのごとく自動的に表示してくれる点です。

出力画面サンプル

例として、mysqlでmysqlDBのスキーマ情報をSchemaSpyを使用して出力した画面サンプルを載せておきます。

5.0.0

現行バージョン。
Graphvizで出力される画像は、cmap(クリッカブルマップ)になっていて、使い勝手はよいと思います。
ただ、このバージョンはUI的に少しレトロな感じは否めません。

tables
relationships
utility tables
constraints
anomalies
columns
table

6.0.0-rc2

現時点(2017.11.27)で schemaspy-6.0.0-rc2 がでています。見た目がモダンになってますね。
不具合なのか仕様なのは不明ですが、暗黙の依存関係の出力結果が 5.0.0 と違うようです。

tables
relationships
orphan tables
constraints
anomalies
columns
table

用意するもの

SchemaSpy本体

SchemaSpyのDownloadリンクから最新版の jarファイルを取得。
ライセンスは、LGPL2.1です。

6.0.0-rc2 は GitHub からダウンロードできます。

利用する databaseType 用の java driver

databaseType Download Links
ora/orathin 11g Java Driver
mysql mysql-connector-java
pgsql PostgreSQL JDBC Driver

Java 5+

http://www.java.com/getjava/

使い方

mysqlの場合

$ java -jar schemaSpy_5.0.0.jar \
	-t mysql \
	-db mysql \
	-s mysql \
	-host localhost:3306
	-u $USER \
	-p $PASS \
	-dp mysql-connector-java-5.1.44-bin.jar \
	-o $OUTDIR

これで $OUTDIR 配下にHTMLファイルと画像ファイルが出力されました。
$OUTDIR/index.html をブラウザで開くと上記の出力画面サンプルのようなページが表示されます。
※ schemaspy-6.0.0-rc2 も使い方はほぼ同じです(ヘルプ参照)

よく使いそうなパラメーター:

Parameter 必須 初期値 説明
-t databaseType ora データベースのタイプ(例、ora, mysql, pgsql, db2,..)。下記のヘルプ参照。
-db dbName データベース名
-host hostname databaseType により必須の場合がある。
-port portNumber databaseType により必須の場合がある。
-s schema スキーマ名。ユーザーID=スキーマ名 の場合は省略可能
-u user * 接続するユーザーID
-p password パスワード。パスワード不要のDB、または、空のパスワードが設定されている場合は省略可。
-pfp Prompt For Password. パスワード(-p)をコマンドラインに含めたくない時に使う。
-o path * 生成されるHTML/グラフを出力するディレクトリのパス
-dp driverpath databaseTypeで指定したDB用のJDBCドライバのパス。
-i regexp 生成対象をテーブル名の正規表現で絞り込むする。
-I regexp -i の逆。生成対象をテーブル名の正規表現で除外する。
-x regexp 暗黙の外部キー参照を正規表現で除外する。
-noimpolied 暗黙の外部キー参照を行わない。
-noviews ビュー表を生成対象から除外する。
-imageformat format png 画像の出力フォーマット(png,svg)を指定する(6.0.0以降)。

全テーブルではなく一部のテーブルだけ出力したいときは、テーブル名に対して正規表現でフィルタを書けることができます。

テーブル名が”innodb”で始まるものだけを抽出したい場合:

-i "(innodb.*)"

テーブル名に”help”を含まず、”time_zone”で始まらないものだけを抽出したい場合:

-I "(.*help.*)|(time_zone.*)"

また、暗黙の外部キー参照をコントロールすることができます。 “book.isbn”と”borrower.address”は”暗黙の外部キー参照を行いたくない場合:

-x "(book.isbn)|(borrower.address)"

ヘルプ

6.0.0-rc2 の方だけ掲載します。

help

databaseType によって追加で必要になるパラメータが変わります。
上記の 使い方 のところで出てきた”-imageformat”オプションは、ここ に書いてあります。

$ java -jar schemaspy-6.0.0-rc2.jar -help
  ____       _                          ____
 / ___|  ___| |__   ___ _ __ ___   __ _/ ___| _ __  _   _
 \___ \ / __| '_ \ / _ \ '_ ` _ \ / _` \___ \| '_ \| | | |
  ___) | (__| | | |  __/ | | | | | (_| |___) | |_) | |_| |
 |____/ \___|_| |_|\___|_| |_| |_|\__,_|____/| .__/ \__, |
                                             |_|    |___/

                                              6.0.0-rc2

SchemaSpy generates an HTML representation of a database schema's relationships.

(snip)

INFO  - No active profile set, falling back to default profiles: default
INFO  - Usage: java -jar schemaspy-6.0.0-rc2.jar [options]
  Options:
    ?, -?, /?, -h, help, -help, --help
      show general usage and available options
    -dbHelp, -dbhelp, --dbHelp, --dbhelp
      Show built-in database types and their required connection parameters
    -cat, --catalog, catalog, schemaspy.cat, schemaspy.catalog
      catalog
    -db, -database-name, schemaspy.db, schemaspy.database-name
      Name of database to connect to
    -t, --database-type, database-type, schemaspy.t, schemaspy.database-type
      type of database
      Default: ora
    -dp, --driverPath, driverPath, schemaspy.dp, schemaspy.driverPath
      path to look for JDBC drivers before looking in driverPath in [databaseType].properties
  * -o, --outputDirectory, outputDirectory, schemaspy.o, schemaspy.outputDirectory
      directory to place the generated output in
    -port, --port, port, schemaspy.port

    -s, --schema, schema, schemaspy.s, schemaspy.schema
      name of the schema to analyze (defaults to the specified user)
  * -u, --user, user, schemaspy.u, schemaspy.user
      connect to the database with this user id

Go to http://schemaspy.org for a complete list/description of additional parameters.

Sample usage using the default database type (implied -t ora):

 java -jar schemaSpy.jar -db mydb -s myschema -u devuser -p password -o output


INFO  - Started Main in 2.21 seconds (JVM running for 2.969)

dbhelp

databaseType に関するヘルプです。
対応するdatabaseType の数が 5.0.0 の23 から 32 に一気に9つも増えてます。

$ java -jar schemaspy-6.0.0-rc2.jar -dbhelp
  ____       _                          ____
 / ___|  ___| |__   ___ _ __ ___   __ _/ ___| _ __  _   _
 \___ \ / __| '_ \ / _ \ '_ ` _ \ / _` \___ \| '_ \| | | |
  ___) | (__| | | |  __/ | | | | | (_| |___) | |_) | |_| |
 |____/ \___|_| |_|\___|_| |_| |_|\__,_|____/| .__/ \__, |
                                             |_|    |___/

                                              6.0.0-rc2

SchemaSpy generates an HTML representation of a database schema's relationships.

(snip)

INFO  - No active profile set, falling back to default profiles: default
INFO  - Built-in database types and their required connection parameters:
 db2:
  IBM DB2 with the 'App' Driver
   -db   	database name
 db2net:
  IBM DB2 with the Type 4 'Net' Driver
   -hostOptionalPort
   -db   	database name
 db2zos:
  IBM DB2 for z/OS with the 'App' Driver
   -db   	database name
 db2zosnet:
  IBM DB2/zos with the Type 4 'Net' Driver
   -hostOptionalPort
   -db   	database name
 derby:
  Derby Embedded Server
   -db   	path to database
 derbynet:
  Derby Network Server
   -hostOptionalPort
   -db   	database name
 firebird:
  Firebird
   -hostOptionalPort
   -db   	database name
 h2:
  H2 Server
   -db   	database name
 hsqldb:
  HSQLDB Server
   -hostOptionalPort
   -db   	database name
 impala:
  Imapla
   -hostOptionalPort
   -db   	database name
 informix:
  InformixSQL
   -hostOptionalPort
   -db   	database name
   -server   	database server
 jtds:
  Microsoft SQL Server JTDS
   -hostOptionalPort
   -db   	database name
 mariadb:
  MariaDB
   -hostOptionalPort
   -db   	database name
 maxdb:
  MaxDB
   -host   	Name of the computer on which the database instance is running
   -db   	Name of database instance
 mssql:
  Microsoft SQL Server
   -hostOptionalPort
   -db   	database name
 mssql-jtds:
  jTDS JDBC Driver for Microsoft SQL 2000/2005 Server
   -hostOptionalPort
   -db   	database name
 mssql-jtds-instance:
  jTDS JDBC Driver for Microsoft SQL 2000/2005 Server
   -hostOptionalPort
   -db   	database name
   -instance   	Named instance to connect to
 mssql05:
  Microsoft SQL Server 2005+
   -hostOptionalPort
   -db   	database name
 mssql05-jtds:
  jTDS JDBC Driver for Microsoft SQL 2000/2005 Server
   -hostOptionalPort
   -db   	database name
 mssql05-jtds-instance:
  jTDS JDBC Driver for Microsoft SQL 2000/2005 Server
   -hostOptionalPort
   -db   	database name
   -instance   	Named instance to connect to
 mysql:
  MySQL
   -hostOptionalPort
   -db   	database name
 mysql_socket:
  MySQL
   -host   	host where database resides with optional port
   -db   	database name
   -socketFactory   	ClassName of socket factory which must be in your classpath
   -socket   	Path To Socket
 netezza:
  Netezza
   -hostOptionalPort
   -db
 ora:
  Oracle with OCI8 Driver
   -db   	database name (from TNSNAMES.ORA)
 orathin:
  Oracle with Thin Driver
   -hostOptionalPort
   -db   	database SID as known on host
 pgsql:
  PostgreSQL
   -hostOptionalPort
   -db   	database name
 redshift:
  Amazon redshift
   -hostOptionalPort
   -db   	database name
 sqlite:
  SQLite
   -db   	path to database or :memory:
 sybase:
  Sybase Server (jdbc3)
   -hostOptionalPort
   -db   	database name
 sybase2:
  Sybase Server (jdbc2)
   -hostOptionalPort
   -db   	database name
 teradata:
  Teradata
   -db   	database name
   -s   	?????
   -port   	?????
 udbt4:
  DB2 UDB Type 4 Driver
   -hostOptionalPort
   -db   	database name
INFO  - You can use your own database types by specifying the filespec of a .properties file with -t.
INFO  - Grab one out of schemaspy-6.0.0-rc2.jar and modify it to suit your needs.
INFO  - Started Main in 2.138 seconds (JVM running for 2.917)

感想

テーブル個別ページで、表示中のテーブルと関連テーブルの関係図を表示してくれるところが非常に気が利いています。新バージョンではUIが改善され、見やすくなっていてとてもいい感じです。

個人的には、運用上外部制約を張りづらいテーブルでも、カラム名、データ型、データ長で他のテーブルと暗黙のリレーションを勝手に見つけてくれるところが気に入ってます(もちろん、ハズレ=間違った名寄せも十分ありえますが、上記の通り暗黙の外部キー参照を細かくコントロールすることで対処できるので、正しく使用すればほぼ問題ありません)。

あとは、静的HTMLが出力されるところが、動的に出力する類似のツールと比べてメリットでもありデメリットでもあると、いったところでしょうか。