データベースの準備

チェンジログの記述が終わったら、後はスキーマを作る対象となるデータベースを用意すれば、LiquiBaseでスキーマを作成する準備は完了だ。

筆者は今回MySQL 5.0.45に、データベース「dev」(開発者用データベース、という意味を込めた)を作成した。本稿の内容をMySQLで試そうとする方は、以下の手順を参考にするとよい。

なお、「>」で始まる部分はシェルのプロンプト、「mysql>」で始まる部分はMySQLクライアントのプロンプト、それ以外はプログラムによる出力だ。

まずrootでログインし、devデータベースの作成と一般ユーザ「shumpei」への権限付与を行う。

> mysql -u root -p
Enter password: *****

mysql> create database dev;
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on dev.* to shumpei@localhost with grant option;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

データベースを作成したら、shumpeiユーザでデータベースにログインできることを確認する。

> mysql -u shumpei -p dev
Enter password: *****

mysql> show tables;
Empty set (0.01 sec)

liquibaseコマンドの実行

いよいよLiquiBaseを使用したDBのマイグレーションを行う。必要な作業はコマンドプロンプト上でliquibaseコマンドを実行するだけだ。

liquibaseコマンドの基本的な書式を以下に示す(実際は1行で指定)。

liquibase --driver=<JDBCドライバのクラス名>
          --classpath=<クラスパス>
          --changeLogFile=<チェンジログファイルのパス>
          --url=<データベースURL>
          --username=<データベースユーザ名>
          --password=<データベースパスワード>
          <サブコマンド>

JDBCをご存じの方であれば、オプションのほとんどは容易に理解できるだろう。「--changeLogFile」でチェンジログを記述したXMLファイルのパスを指定すること、引数の最後でサブコマンドを指定することに注意していただきたい。ここで使用するコマンドは、DBのマイグレーションを行うためのサブコマンド「migrate」だ。

以上を踏まえて、実際に実行したコマンドは以下の通り(実際は1行)。MySQLに接続するためのJDBCドライバをお持ちでない方は、こちらのページからダウンロードしよう。

>liquibase --driver=com.mysql.jdbc.Driver
           --classpath=lib\mysql-connector-java-5.0.7-bin.jar
           --changeLogFile=db_changelog.xml
           --url=jdbc:mysql://localhost/dev
           --username=shumpei
           --password=*****
           migrate

Migration successful (← コマンドの出力)

コマンドが成功したら、MySQLに戻って実行結果を確認してみよう。「show tables」コマンドを実行すれば、データベース内のテーブルを一覧表示させることができる。

mysql> show tables;
+-----------------------+
| Tables_in_dev         |
+-----------------------+
| databasechangelog     |
| databasechangeloglock |
| person                |
+-----------------------+
3 rows in set (0.00 sec)

確かにpersonテーブルが作成されている!

その他の二つのテーブル(databasechangelogとdatabasechangeloglock)は、LiquiBaseがスキーマの変更管理情報を格納するために利用するものだ。あまり深入りする必要はないが、databasechangelogテーブルの内容は非常に重要なので、一度内容を確認してみることをお勧めする。

リスト: databasechangelogテーブルのスキーマを確認する

mysql> desc databasechangelog;
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| ID           | varchar(150) | NO   | PRI |         |       |
| AUTHOR       | varchar(150) | NO   | PRI |         |       |
| FILENAME     | varchar(255) | NO   | PRI |         |       |
| DATEEXECUTED | datetime     | NO   |     |         |       |
| MD5SUM       | varchar(32)  | YES  |     | NULL    |       |
| DESCRIPTION  | varchar(255) | YES  |     | NULL    |       |
| COMMENTS     | varchar(255) | YES  |     | NULL    |       |
| TAG          | varchar(255) | YES  |     | NULL    |       |
| LIQUIBASE    | varchar(10)  | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
9 rows in set (0.02 sec)

changeSetタグで指定したidとauthor、そしてチェンジログファイルの名前(FILENAME列)によって行が一意に特定されていることがおわかりだろう。