Когда-то я представлял вашему вниманию инструмент для управления изменениями в БД - liquibase. Теперь я решил описать как его можно использовать в проектах с maven-сборкой, и hibernate.
Для начала необходимо создать отдельный maven-артефакт, который будет содержать только ресурсы - xml-файлы с changeSet-ами от liquibase. Структура файлов в папке resources
нашего артефакта следующая:
/changelogs/версия_проекта/*-changelog.xml
/changelogs/версия_проекта/release-changelog.xml
/project-changelogs.xml
Файл project-changesets.xml
включает в себя набор файлов release-changelog.xml
всех версий проекта, вот пример его содержимого:
Таким же образом файлы release-changelog.xml
включают в себя список файлов с измененями, находящихся в той же папке и касающихся лишь данной версии проекта. Сами изменения я предпочитаю описывать не пользуясь при это тэгами liquibase, а использую привычный SQL.
Благодаря наличию в liquibase такого понятия как "контекст", можно разделить все операции над БД на три контекста:
schemedata
- контекст в котором будут отражены изменения структруры базы;initdata
- контекст определяющий данные для инициализации БД, например добавление новых пользовательских ролей;migratedata
- контекст используемый при изменении "живых" данных, т.е данных появляющихся в системе при ее эксплуатации.
Такая концепция позволит вам четко разделять виды изменений в БД. А также "накатывать" изменения лишь нужных контекстов. Пример:
Если в проекте предполагается использовать две базы - БД разработчика/продакшн и БД для тестов, то pom-файл, созданного нами артефакта, будет содержать следующие строки:
Параметры app.database.xxx
и test.database.xxx
можно определить в головном pom-файле проекта. Теперь накатывать изменения на обе БД можно одной командой:
mvn process-resources
либо mvn clean install
Чтобы сделать rollback обеих баз на несколько changeset-ов назад к команде следует добавить параметры:
-Dliquibase.goal=rollback -Dliquibase.rollbackCount=1
liquibase.rollbackCount
- определят кол-во changeset
-ов которые следует откатить.
Порой может возникнуть ситуация, когда требуется внести изменение в существующий changeset и заново накатить все changeset-и. Здесь поможет параметр:
-Dliquibase.dropFirst=true
Если потребуется работать с каждой БД отдельно, то необходимо использовать уже команды самого плагина liquibase:
mvn liquibase:update
либо mvn liquibase:rollback
Для тестовой БД добавляем параметр -Ptestdb
в командной строке.
2 комментария:
Хоть бы потрудился оставить некоторые комментарии. А так вывалил не понятно что.
Очень помогло. Спасибо большое за труды.
Отправить комментарий