The データベース変更ログファイル は、すべてのデータベースへの変更を記録するものです。XML をベースにしていますから、空の XML ファイルから始めましょう:
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.6" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.6 http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.6.xsd"> </databaseChangeLog>
それぞれの 変更セットは、”id” と “author” 属性によって一意に識別されます。これら2つのタグは、名前とパッケージ、changelog ファイルと一緒に使われ、変更を一意に特定します。仮に “id” だけで一意に指定するのでよいなら、すぐに誤って重複が発生するでしょう、複数の開発者と複数のコードブランチが関連する場合は特に。 “author” 属性を保持することで、重複の可能性を最小限にしています。
それぞれの変更セットは、データベースへ適用したいアトミックな変更であることを考慮しましょう。通常は、一つの変更セットに、たったひとつだけの変更を含むのがよいやり方です、しかしもっと多くの変更を含むことも可能です。もし、複数の行を insert して、何らかの理由で失敗した場合に、すべてをいっぺんに取り消したいといった理由がある場合もあるでしょうから。LiquiBase はそれぞれの変更セットをトランザクションとして実行しようとします。しかし多くのデータベースは暗黙的なコミットを行い、各コマンドをトランザクションとして保持してしまいます (create table, drop table など)
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.6" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.6 http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.6.xsd"> <changeSet id="1" author="bob"> <createTable tableName="department"> <column name="id" type="int"> <constraints primaryKey="true" nullable="false"/> </column> <column name="name" type="varchar(50)"> <constraints nullable="false"/> </column> <column name="active" type="boolean" defaultValue="1"/> </createTable> </changeSet> </databaseChangeLog>
コマンドライン、 Ant、Maven、Grails、そして サーブレットリスナーを通じて、変更ログに含まれる変更を実施する多くの方法があります。
liquibase --driver=com.mysql.jdbc.Driver \
--classpath=/path/to/classes \
--changeLogFile=com/example/db.changelog.xml \
--url="jdbc:mysql://localhost/example" \
--username=user \
--password=asdf \
migrate
データベースに “department” という名前のテーブルができているはずです。そのほかにも2つのテーブルができているでしょう。”databasechangelog” と “databasechangeloglock” の2つです。 databasechangelog テーブルは、データベースに対して実行されたすべての 文を保持しています。databasechangeloglock テーブルは、2つの環境から同時に同じデータベースの移行をしないために使用されます。