如何更改Spring Boot和Liquibase的databasechangelog.filename?

时间:2018-07-13 19:32:12

标签: spring-boot liquibase

我正在使用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代码,以确定是否可以更改此值。我最接近的是以下两个观察结果:

  1. SQL文件的绝对文件路径被修剪为最终值here.
  2. here可以保留所有要保留的更改。而且,如果我在调试时更改了其中一个值,则可以看到它进入了数据库。

如果有办法使它们保持一致,或者可能只是将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。我不记得在哪里找到此设置,但是我没有“更改集”的任何特定内容,这对我来说是个错误吗?

3 个答案:

答案 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/作为前缀。

感谢其他帮助我指出正确方向的答案!