вторник, 28 октября 2008 г.

Миграция данных с LiquiBase

Во всех проектах, в которых мне довелось принимать участие, реализуемых на Java-платформе, я наблюдал примерно одну и ту же картину. Когда дело доходило до релиза и дальнейшего сопровождения изменений в БД, разработчикам всегда приходилось писать, либо уже использовать некий самописный механизм инкрементальной миграции данных.

Однако, я был убежден в том, что такого рода фреймворк должен быть уже кем-то написан. Им оказался LiquiBase написанный на той же Java и выпущенный под лицензией LGPL. Вот основные фичи этого проекта:

  • Не зависит от реализации БД, поддерживает: MySQL, PostgreSQL, Oracle, MS SQL, DB2, Derby, HSQL
  • Возможность проведения миграций от нескольких пользователей одновременно
  • Поддержка rollback-а миграций
  • Описание миграций в XML файле, с помощью внутренних команд.
  • Интеграция c Maven, Ant, Spring, Hibernate, Grails, возможность запуска из коммандой строки.

Формат документа, в котором описываются сами миграции выглядит примерно следующим образом:

<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.8"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.8
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.8.xsd">

<changeSet id="1" author="bob">
<comment>Create table<comment>
<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>

<changeSet id="2" author="sam">
<comment>Change name</comment>
<sql>
UPDATE TABLE SET name = 'someone' WHERE name = 'foo';
</sql>
<rollback>
<sql>
UPDATE TABLE SET name = 'foo' WHERE name = 'someone';
</sql>
</rollback>
</changeSet>
</databaseChangeLog>
Также хорошую статью на эту тему можно прочитать здесь.



Использование liquibase с hibernate и maven. Часть 1

3 комментария:

Анонимный комментирует...

Спасибо за наводку, буду использовать в проекте.

Правда, GUI у меня не заработал по-хорошему, буду править update-log вручную.

Dmitriy комментирует...

Хорошо, только не понятно зачем самому rollback описывать? Транзакции должны заниматься этим

Dmitriy комментирует...

И можно ли вызывать sql создания функций? JDBC не позволяет делать такие вызовы.