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

How to alter databasechangelog.filename for Spring Boot and Liquibase?

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

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

db/changelog/changes/v0001.sql

如果我创建一个带有嵌入式 Tomcat 和 运行 应用程序的 fat jar,相同的变更集将出现在数据库中:

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

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

我找到了对 logicalFilePath 的引用(例如 this SO question),但我认为这不会提供我需要的内容。

我也试过调试 Liquibase 代码以确定是否有办法改变这个值。我最接近的是这两个观察结果:

  1. SQL 文件的绝对文件路径修剪为其最终值 here.
  2. 正在保存的全套更改可用 here。如果我更改其中一个值(在调试时),我可以看到它已进入数据库。

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

更新

我在 Spring 引导中有如下 Liquibase 设置:

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

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

然后在 resources/db/changelog/changes 中,我有单独的 *.sql 文件,其中包含我想要 运行 的 SQL。我不记得我是在哪里找到这个设置的,但我没有任何特定于 "changesets" 的东西,这是我的错误吗?

logicalFilePath属性正是您想要的。我在我的项目中遇到了同样的问题,我使用 Maven 执行某些部分,使用 spring-boot 执行某些部分。 也可以帮到你

在每个变更集上设置 logicalFilePath。这将确保 DATABASECHANGELOG.FILENAME 列是一致的,并且不依赖于变更集文件的物理签出目录 as explained in this post.

我可以通过不再使用 db.changelog-master.yaml 文件中的 includeAll 选项来使用它。 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运行ning 时该列的显示方式
  • BOOT-INF/classes/db/changelog/changes/v0001_users.sql 是从可执行 jar 运行ning 时该列的显示方式。

更改后,以上两个选项相同,不再包含 BOOT-INF/classes/ 作为前缀。

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