Понимание поведения logicFilePath в жидкости - PullRequest
1 голос
/ 08 февраля 2020

У одного из моих наборов изменений был логический логический_файл_пути, который был неверным (два набора случайно имели один и тот же логический_файл), и после редактирования логического-логического пути в существующем наборе изменений обновление жидкостной базы завершилось ошибкой из-за повторяющегося столбца, что означало бы, что жидкая база считала набор изменений быть не выполненным и перезапустить его.

Определяет ли liquibase, был ли набор изменений уже выполнен на основе флага «EXECUTED» или комбинации «id», «author» и «logicFilePath»?

Кроме того, как я могу исправить ошибку в этом случае, когда существующий набор изменений имеет неправильный логический путь_файла

1 Ответ

2 голосов
/ 10 февраля 2020

Как это работает :

Из документации Liquibase:

logicalFilePath - используется для переопределения имени файла и пути при создании уникального идентификатора наборов изменений. Требуется при перемещении или переименовании журналов изменений.

Liquibase вычисляет контрольную сумму MD5 набора изменений на основе:

  • содержимого набора изменений;
  • id набора изменений;
  • автор набора изменений;
  • путь и имя вашего файла changeLog или logicalFilePath;

Если вы ничего не меняйте в вашем наборе изменений и просто попытайтесь перезапустить его, Liquibase посмотрит на databasechangelog.id, databasechangelog.author, databasechangelog.FILENAME и databasechangelog.MD5SUM, и если все будет так же, как было то набор изменений будет пропущен.

Если вы измените содержимое набора изменений, liquibase выдаст ошибку, что контрольная сумма была изменена (в то время как databasechangelog.id, databasechangelog.author и databasechangelog.FILENAME остаются неизменными).

Если вы измените идентификатор, автора или путь (logicFilePath) , то Liquibase подумает, что это новый набор изменений и попытается выполнить его.

Почему у вас есть проблемы :

Liquibase относится к вам u измените значение как новое, и при появлении ошибки:

обновление не удалось с ошибкой дублирующегося столбца

Я полагаю, у вас нет preConditions в ваш набор изменений или их недостаточно,

Как вы это исправите:

Итак, поскольку liquibase считает, что вы выполняете новый набор изменений, ничто не остановит вас после записи этих:

<preConditions onFail="MARK_RAN">
    <not>
        <columnExists tableName="your_table" columnName="your_column"/>
    </not>
</preConditions>

и поскольку your_table.your_column уже существует в базе данных, этот набор изменений будет помечен как databasechangelog.EXECTYPE=MARK_RAN и пропущен.

Проблема решена!

...