シナリオ2 (Diffとドキュメント出力)

さて、開発も順調に進み、そろそろ本番環境へのDBマイグレーションを考慮しなければならなくなったとしよう。

その際に必要なのは、開発用DBと本番用DBに現在どれだけの差異があるか、を確認することだ。LiquiBaseはそのための機能を「diff」サブコマンドで提供している。 diffサブコマンドの使用法は、以下の通りだ。

liquibase diff --baseUrl=<比較元となるDBのURL>
               --baseUsername=<比較元となるDBのユーザ名>
               --basePassword=<比較元となるDBのパスワード>

本番環境のデータベース名が「production」だとすると、実行するコマンドとその出力結果は以下のようになる。

> liquibase diff --baseUrl=jdbc:mysql://localhost/production --baseUsername=shumpei --basePassword=*****
Diff Results:
Base Database: shumpei jdbc:mysql://localhost/dev
Target Database: shumpei jdbc:mysql://localhost/production
Product Name: EQUAL
Product Version: EQUAL
Missing Tables: NONE
Unexpected Tables: NONE

…略…

Missing Columns:
     person.is_deleted

…略…

「…略…」に挟まれた部分に、「productionデータベースにはpersonテーブルのis_deleted列がない」と表示されているのがお解りだろう。このように、diffサブコマンドを用いれば出力されたデータベース間の差異を確認することができる。

またdiffChangeLogというサブコマンドを用いれば、DB間の差分を埋めるためのコードをチェンジログの形で出力させることができる。

> liquibase diffChangeLog --baseUrl=jdbc:mysql://localhost/production --baseUsername=shumpei --basePassword=*****

Reading tables for shumpei @ jdbc:mysql://localhost/dev ...

…略…

Reading sequences for shumpei @ jdbc:mysql://localhost/production ...
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.3"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ht
tp://www.liquibase.org/xml/ns/dbchangelog/1.3 http://www.liquibase.org/xml/ns/db
changelog/dbchangelog-1.3.xsd">
    <changeSet author="diff-generated" id="1192530329578-1">
        <addColumn tableName="person">
            <column defaultValue="0" name="is_deleted" type="BIT"/>
        </addColumn>
    </changeSet>
</databaseChangeLog>

こうして生成したチェンジログを直接、もしくは一部利用してマイグレーションを行うことも可能だ。

さらに、LiquiBaseはデータベースとチェンジログの情報を、JavaDocに似た形式のドキュメントとして出力することも可能だ。そのためには「dbDoc」サブコマンドに、出力先のディレクトリパスを指定してコマンドを実行する。

>liquibase dbDoc .\docs\db

このコマンドを実行すると、現在のディレクトリ以下にdocs\dbというディレクトリツリーが生成され、その中にHTMLドキュメントが出力される。

「dbDocs」サブコマンドにより出力されたHTMLファイル

このドキュメントには、データベース内のオブジェクトやチェンジログにエントリを記述した開発者 (author属性の値)などが表示される。さらに、DBに反映されていないチェンジログの状況も表示されるので、チェンジログ⇔DBの間の差分を確認することも可能だ。これを利用すれば、本番環境のDBと、開発用DBのチェンジログを比較して、ドキュメント化することもできる。