如何为 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 代码以确定是否有办法改变这个值。我最接近的是这两个观察结果:
如果有办法使这些一致,或者可能只是将 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/
作为前缀。
感谢其他帮助我指明正确方向的答案!
我正在使用 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 代码以确定是否有办法改变这个值。我最接近的是这两个观察结果:
如果有办法使这些一致,或者可能只是将 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/
作为前缀。
感谢其他帮助我指明正确方向的答案!