После обновления сервиса с java 8 до java 11 наша liquibase сошла с ума и попыталась применить все изменения к базе данных с самого начала. Но они уже были применены, и никаких изменений в базу данных внесено не было. Мы обнаружили, что использование дат ISO в качестве идентификаторов набора изменений было плохой идеей. Трудный путь.
Наборы изменений ликвидной базы
Наборы изменений в liquibase – это, как следует из их названия, набор изменений, которые должны быть применены сразу в базе данных (или не применяться вообще).
Для того чтобы liquibase могла отличать, когда набор изменений уже применен или нет, вам необходимо установить уникальный идентификатор.
По соглашению мы начали использовать дату ISO, когда было внесено изменение (формат гггг-мм-дд).
Например:
databaseChangeLog:
- changeSet:
id: 2019-06-06
author: sergiomoratilla
comments: Adding new value to know which client was used to book.
changes:
- modifyDataType:
tableName: reservation
columnName: client
newDataType: ENUM('WEB_DESKTOP', 'WEB_MOBILE', 'APP_ANDROID', 'APP_IOS', 'UNKNOWN') NOT NULL
Liquibase хранит примененный набор изменений в таблице DATABASECHANGELOG в вашей схеме. Так что мы ожидали скандала
"2019-06-06" sergiomoratilla /liquibase/changelogs/this-example.yml ...
Это ловушка
Анализатор Liquibase YML решает получить идентификатор набора изменений в качестве даты, а затем использовать toString() для генерации идентификатора. Это пахнет тем, что вы не контролируете этот формат … и это именно то, что произошло.
Вместо сохранения “2019-06-06” мы получили “Ср. 06 июня 00:00:00 GMT 2019”.
После обновления до Java 11 поведение toString() изменилось и теперь возвращает “Ср. 06 июня 02:00:00 CEST 2019”. Это точно та же дата, так что этот формат правильный, но доверять вашим идентификаторам форматированию по умолчанию немного слабо.
Решения
Не используйте дату ISO в качестве идентификаторов (если вы используете формат yaml для его настройки). Вероятно, большинство из вас еще этого не сделали.
Когда в одну и ту же дату у нас появилось несколько изменений, мы решили изменить этот формат на ггггммдд-n, где n – инкрементное целое число.
Что делать, если вы уже используете их? Я предлагаю вам заменить идентификаторы в ваших файлах журнала изменений на идентификаторы, которые у вас уже есть в базе данных. И измените свое соглашение для новых файлов!
Оригинал: “https://dev.to/sgmoratilla/liquibase-don-t-use-iso-dates-as-changeset-ids-4c9e”