Не буду разжевывать то что и так везде разжевано, просто запишу тут некоторые вещи.
Если нужно управлять ченджсетами вне контекста java-приложения, то это можно сделать непосредственно через утилиту liquibase.exe.
Для начала нужно установить liquibase на компьютер.
Затем добавить в директорию lib драйвер postgre-jdbc (желательно версии не ниже 9.6, а то будут потом проблемы).
Затем запускать из директории проекта.
Применение файла _.xml (если это обновление уже применено, то второй раз уже не применяется):
liquibase --changeLogFile=meapp/src/main/resources /liquibase/db/changesets/_.xml --url jdbc:postgresql://localhost:5432/ccprod --username postgres -- password 1 --logLevel 5 update
При этом история применения обновлений сохраняется в двух служебных таблицах: databasechangelog и databasechangeloglock.
Вместо update можно применять другие команды:
history - показать историю обновлений (https://docs.liquibase.com/commands/community/history.html)
rollbackCount 1 - откатить одно последнее обновление (https://docs.liquibase.com/workflows/liquibase-community/using-rollback.html?Highlight=rolling%20back)
updateTestingRollback - тот же update, но с тестированием отката. Но работает странно: не следит что база сохраняет консистентность
В качестве тестового файла можете использовать этот:
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd"> <changeSet id="myid-0" author="knastnt"> <createTable tableName="test_table"> <column autoIncrement="true" name="form_id" type="integer"/> <column name="form_type" type="varchar(255)"/> <column name="form_type_ru" type="varchar(255)"/> <column name="send_to_ab_flag" type="BOOLEAN"/> <column name="ab_title_flag" type="BOOLEAN"/> <column name="is_initial" type="BOOLEAN"/> <column name="is_update" type="BOOLEAN"/> <column name="send_to_bc_flag" type="BOOLEAN"/> </createTable> </changeSet> <changeSet id="myid-1" author="knastnt"> <insert tableName="test_table"> <column name="form_type" value="notification"/> <column name="form_type_ru" value="Уведомление"/> <column name="send_to_ab_flag" valueBoolean="false"/> <column name="ab_title_flag" valueBoolean="false"/> <column name="is_initial" valueBoolean="false"/> <column name="is_update" valueBoolean="false"/> <column name="send_to_bc_flag" valueBoolean="false"/> </insert> <rollback> <delete tableName="test_table"> <where>form_type='notification'</where> </delete> </rollback> </changeSet> </databaseChangeLog>
Если мы сделаем update этому файлу, то по порядку каждый ченджсет применится (если только уже не был применен). При этом в истории (history) появится два ченджсета. Если после этого сделать
rollbackCount 1, то произойдёт откат последнего ченджсета (исчезнет запись из таблицы). Если применить
rollbackCount 1 снова, то откатится ещё один ченджсет (удалится вся таблица). Можно применить просто
rollbackCount 2.
Надо заметить, что rollback описан только в одном ченджсете. Это потому что liquibase умеет генерировать скрипты для отката самостоятельно (как в случае первого ченджсета). Со вторым ченджсетом liuqibase не справился и rollback пришлось писать руками. Можно попробовать удалить явный роллбэк руками и запустить команду отката - liquebase ругнётся что не смог.
Однако, если ченджсеты применены приложением, откатить из через cmd просто так не получится, т.к. относительные пути к ченджсетам будут разные, и как их привести к единому виду - я так и не разобрался. Ещё можно как-то делать через maven, но тоже как-то не зашло...
Насчет написания ченджсетов для приложения с нуля, я пришел к выводу что проще делать через spring.jpa.hibernate.ddl-auto=create, а потом создавать ченджсеты автоматически на основе имеющейся БД:
liquibase --url jdbc:postgresql://localhost:5432/cclocal --username ccuser --password 123321 --logLevel 5 --changeLogFile=dbchangelog.xml generateChangeLog
таким образом сгенеритуется ченджсет в файл dbchangelog.xml