我正在使用Spring Boot 2.0.1和liquibase-core-3.5.5
。
当我从IntelliJ运行应用程序(它将运行main()
方法)时,我在Liquibase数据库列database.filename
中看到以下类型的值:
db/changelog/changes/v0001.sql
如果我使用嵌入式Tomcat创建胖子并运行该应用程序,则数据库中将显示与以下相同的更改集:
BOOT-INF/classes/db/changelog/changes/v0001.sql
我希望这些值匹配,以便我可以将应用程序作为JAR文件运行,但是如果需要调试,可以从IntelliJ连接到远程数据库。 (注意:这将用于测试数据库,我不会以这种方式调试生产。)
我找到了对logicalFilePath
(例如this SO question)的引用,但是我不相信这会满足我的需求。
我还尝试调试Liquibase代码,以确定是否可以更改此值。我最接近的是以下两个观察结果:
如果有办法使它们保持一致,或者可能只是将filename
列更改为实际的文件名(例如v0001.sql
),那将是最好的。
更新
我在Spring Boot中具有以下Liquibase设置:
我的resources/db/changelog/db.changelog-master.yaml
文件具有以下内容:
databaseChangeLog:
- includeAll:
path: db/changelog/changes/
然后在resources/db/changelog/changes
中,我有单独的*.sql
文件,其中包含我要运行的SQL。我不记得在哪里找到此设置,但是我没有“更改集”的任何特定内容,这对我来说是个错误吗?
答案 0 :(得分:1)
logicalFilePath
属性正是您想要的。我的项目面临同样的问题,我在其中使用maven执行某些部分,并使用spring-boot执行某些部分。
this question也可以为您提供帮助。
答案 1 :(得分:1)
在每个变更集上设置logicalFilePath
。这将确保DATABASECHANGELOG.FILENAME
列是一致的,并且不依赖于变更集文件as explained in this post的物理检出目录。
答案 2 :(得分:1)
通过不再使用includeAll
文件中的db.changelog-master.yaml
选项,我可以使用它。 includeAll
选项是快速入门(并处理特定目录中的所有文件)的有用方法,但是对于常规使用而言,似乎不建议这样做。如here所述。
这是我以前在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/
作为前缀。
感谢其他帮助我指出正确方向的答案!