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

mnd*_*mnd 5 liquibase spring-boot

我正在使用Spring Boot 2.0.1和liquibase-core-3.5.5

当我从IntelliJ运行应用程序(它将运行main()方法)时,我在Liquibase数据库列中看到以下类型的值database.filename

db/changelog/changes/v0001.sql
Run Code Online (Sandbox Code Playgroud)

如果我使用嵌入式Tomcat创建胖子并运行该应用程序,则数据库中将显示以下相同的变更集:

BOOT-INF/classes/db/changelog/changes/v0001.sql
Run Code Online (Sandbox Code Playgroud)

我希望这些值匹配,以便我可以将应用程序作为JAR文件运行,但是如果需要调试,可以从IntelliJ连接到远程数据库。(注意:这将用于测试数据库,我不会以这种方式调试生产)。

我找到了对logicalFilePath(例如SO问题)的引用,但是我不相信这会满足我的需求。

我还尝试调试到Liquibase代码中,以确定是否可以更改此值。我最接近的是以下两个观察结果:

  1. SQL文件的绝对文件路径在此处被修整为其最终值
  2. 您可以在此处找到要保留的全部更改的完整集合。而且,如果在调试时更改了其中一个值,则可以看到它进入了数据库。

如果有办法使它们保持一致,或者可能只是将filename列更改为实际的文件名(例如v0001.sql),那将是最好的。

更新

我在Spring Boot中具有如下Liquibase设置:

我的resources/db/changelog/db.changelog-master.yaml文件包含以下内容:

databaseChangeLog:
    - includeAll:
        path: db/changelog/changes/
Run Code Online (Sandbox Code Playgroud)

然后,resources/db/changelog/changes我有*.sql包含要运行的SQL的单个文件。我不记得在哪里找到此设置,但是我没有“更改集”的任何特定内容,这是我的错误吗?

mnd*_*mnd 4

我可以通过不再使用文件includeAll中的选项来使用它db.changelog-master.yaml。该includeAll选项是快速入门(并处理特定目录中的所有文件)的有用方法,但似乎不建议常规使用。正如这里提到的。

这是我以前用过的db.changelog-master.yaml不要这样用

databaseChangeLog:
    - includeAll:
        path: db/changelog/changes/
Run Code Online (Sandbox Code Playgroud)

这就是我将其更新为:

databaseChangeLog:
    - include:
        file: db/changelog/changes/v0001_users.sql
    - include:
        file: db/changelog/changes/v0002_accounts.sql
Run Code Online (Sandbox Code Playgroud)

需要注意的重要一点是,我按照我希望其运行的顺序专门列出了我想要包含的每个文件。这有点麻烦,但值得改变。

在原始版本中,该databasechangelog.filename列会根据应用程序的执行方式而有所不同:

  • db/changelog/changes/v0001_users.sql是从 IntelliJ 运行时该列的显示方式
  • BOOT-INF/classes/db/changelog/changes/v0001_users.sql是从可执行 jar 运行时该列的显示方式。

进行更改后,上面的两个选项是相同的,并且不再包含BOOT-INF/classes/作为前缀。

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