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