「チェンジログ」ファイルの作成

LiquiBaseを使用してDBスキーマの定義を行うには、スキーマの「変更ログ」を記述したXMLファイルを用意する必要がある。

以下がそのファイルで、ファイル名は「db_changelog.xml」とした。

リスト:db_changelog.xml

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.1"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.1
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.1.xsd">

    <!-- スキーマに加える変更をchangeSetタグで定義 -->
    <changeSet id="1" author="shiraishi">
        <!-- personテーブルの生成 -->
        <createTable tableName="person">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="first_name" type="varchar(20)">
                <constraints nullable="false"/>
            </column>
            <column name="last_name" type="varchar(20)">
                <constraints nullable="false"/>
            </column>
            <column name="age" type="integer"/>
        </createTable>
    </changeSet>
</databaseChangeLog>

まず、ファイルのルート要素はdatabaseChangeLogタグだ。ファイル内で使用する要素のXML名前空間や、検証用のXMLスキーマを定義したファイルのURLなどを指定する。

子要素として指定するchangeSetタグは、スキーマに対して行う変更を具体的に記述する。LiquiBaseを使用したDBマイグレーションの、まさにキモとなる部分だ。このタグで囲まれた要素は一まとまりのタスクとして扱われる。この例ではテーブルの作成を行う操作であるを一つ指定しただけだが、実際には中に記述する操作の種類や数に制限はない。

changeSetタグは、一つのファイルにいくつ記述しても構わない。各changeSetは、id属性とauthor属性の組み合わせによってファイル内で一意に特定されるため、これらの属性は必須だ。id属性には任意の文字列を指定できる。author属性は、changeSetを記述した人物の名前を指定する。変更者の記録が不要だと感じたなら、author属性には"UNKNOWN"など適当な文字列を指定しておけばよい。

また、一つのchangeSetは同一トランザクション内で実行され、途中でエラーがあった場合はロールバックされる。DDLに対するトランザクション制御をサポートしていないDBMSも多く存在するが、このことは覚えておいてよいだろう。

テーブルを作成するための操作を定義しているのは、createTableタグだ。一見してわかるとおり、ここに書かれた内容はデータベース製品固有の方言に依存しない。createTableで指定された内容から、製品に依存したSQLを生成するのはLiquiBaseの役目となる。現在LiquiBaseがサポートしているDBMSは以下の通りだ。

現在のLiquiBaseがサポートしているDBMS

後に見るように、LiquiBaseで指定できるスキーマ操作は、createTable以外にも多数存在する。その全てが上記のDBMSでサポートされているわけではないが、それでも、「DBMSに依存しない」というのはLiquiBaseの大きな強みだ。