Как изменить databasechangelog.имя файла для Spring Boot и Liquibase?



Я использую Spring Boot 2.0.1 и liquibase-core-3.5.5.



Когда я запускаю приложение из IntelliJ (которое будет запускать метод main()), я вижу следующий тип значения в столбце базы данных Liquibase database.filename:



db/changelog/changes/v0001.sql


Если я создам fat jar со встроенным Tomcat и запущу приложение, тот же набор изменений появится в базе данных как:



BOOT-INF/classes/db/changelog/changes/v0001.sql


Я хотел бы, чтобы эти значения совпадали, чтобы я мог запускать свои приложения как файлы JAR, но подключаться к удаленной базе данных из IntelliJ, если необходима отладка. (Примечание: это было бы для тестовой базы данных, я бы не отлаживал производство таким образом).



Я нашел ссылки на logicalFilePath (например, этот вопрос SO), но я не верю, что это обеспечит то, что мне нужно.



Я также попытался выполнить отладку в коде Liquibase, чтобы определить, есть ли способ изменить это значение. Ближе всего я подошел к этим двум наблюдениям:




  1. абсолютный путь к файлу SQL, обрезанный до его конечное значение здесь.

  2. полный набор сохраняемых изменений доступенздесь . И если я изменю одно из этих значений (во время отладки), я могу увидеть, что оно попадает в базу данных.


Если есть способ сделать их согласованными, или, возможно, просто изменить столбец filename на фактическое имя файла (например, v0001.sql), это было бы лучше всего.



Обновить



У меня есть настройка Liquibase следующим образом в Spring Boot:



Мой resources/db/changelog/db.changelog-master.yaml файл имеет следующее содержание:



databaseChangeLog:
- includeAll:
path: db/changelog/changes/


И затем в resources/db/changelog/changes у меня есть отдельные *.sql файлы, содержащие SQL, который я хочу запустить. Я не помню, где я нашел эту настройку, но у меня нет ничего конкретного для "наборов изменений", это ошибка с моей стороны?

837   3  

3 ответов:

Атрибут logicalFilePath - это именно то, что вам нужно. Я столкнулся с той же проблемой с моими проектами, где я выполнял некоторые части с maven и некоторые части с spring-boot. этот вопрос также может помочь вам.

Установить logicalFilePath на каждом наборе изменений. Это гарантирует, что столбец DATABASECHANGELOG.FILENAME является согласованным и не зависит от вашего физического каталога проверки файла набора изменений, , как описано в этой статье.

Я смог использовать это, больше не используя опцию includeAll в моем файле db.changelog-master.yaml. Опция includeAll является полезным способом быстрого начала работы (и обработки всех файлов в определенном каталоге), но она кажется нецелесообразной для регулярного использования. Как уже упоминалось здесь .

Это то, что я ранее имел в db.changelog-master.yaml, не используйте его таким образом .

databaseChangeLog:
    - includeAll:
        path: db/changelog/changes/

Вот до чего я его обновил:

databaseChangeLog:
    - include:
        file: db/changelog/changes/v0001_users.sql
    - include:
        file: db/changelog/changes/v0002_accounts.sql

Важно отметить, что я специально перечисляю все один файл, который я хочу включить, в том порядке, в котором я хочу его запустить. Это немного хлопотно, но оно того стоит.

В оригинальной версии столбец databasechangelog.filename будет отличаться в зависимости от способа выполнения приложения:

  • db/changelog/changes/v0001_users.sql - это то, как будет выглядеть столбец при запуске из IntelliJ
  • BOOT-INF/classes/db/changelog/changes/v0001_users.sql - это то, как будет выглядеть столбец при запуске из исполняемого файла jar.

После внесения изменений оба варианта выше являются одинаковыми, и нет более длинные включают BOOT-INF/classes/ в качестве префикса.

Спасибо другим ответам, которые помогли мне указать правильное направление!

Comments

    Ничего не найдено.