Как изменить 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, чтобы определить, есть ли способ изменить это значение. Ближе всего я подошел к этим двум наблюдениям:
- абсолютный путь к файлу SQL, обрезанный до его конечное значение здесь.
- полный набор сохраняемых изменений доступенздесь . И если я изменю одно из этих значений (во время отладки), я могу увидеть, что оно попадает в базу данных.
Если есть способ сделать их согласованными, или, возможно, просто изменить столбец 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, который я хочу запустить. Я не помню, где я нашел эту настройку, но у меня нет ничего конкретного для "наборов изменений", это ошибка с моей стороны?
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- это то, как будет выглядеть столбец при запуске из IntelliJBOOT-INF/classes/db/changelog/changes/v0001_users.sql- это то, как будет выглядеть столбец при запуске из исполняемого файла jar.После внесения изменений оба варианта выше являются одинаковыми, и нет более длинные включают
Спасибо другим ответам, которые помогли мне указать правильное направление!BOOT-INF/classes/в качестве префикса.
Comments