Во всех проектах, в которых мне довелось принимать участие, реализуемых на 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 вручную.
Хорошо, только не понятно зачем самому rollback описывать? Транзакции должны заниматься этим
И можно ли вызывать sql создания функций? JDBC не позволяет делать такие вызовы.
Отправить комментарий