当前位置: 首页 > 知识库问答 >
问题:

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

闻人昊昊
2023-03-14

我使用的是Spring Boot 2.0.1和<code>liquibase-core-3.5.5。

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

db/changelog/changes/v0001.sql

如果我使用嵌入式Tomcat创建一个fat jar并运行该应用程序,则数据库中会出现与以下相同的变更集:

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

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

我已经找到了对logicFilePath的引用(例如这个SO问题),但我不相信这会提供我需要的东西。

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

  1. SQL文件的绝对文件路径在此处修剪为其最终值
  2. 此处提供了持久化的完整更改集。如果我更改了其中一个值(在调试时),我可以看到它进入了数据库

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

更新

我在Spring Boot中设置了以下Liquibase设置:

My resources/db/changelog/db.changelog-master.yaml 文件有以下内容:

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

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

共有3个答案

吕鹏
2023-03-14

在每个变更集上设置逻辑文件路径。这将确保数据库更改日志。FILENAME 列是一致的,不依赖于变更集文件的物理签出目录,如本文中所述。

薛弘阔
2023-03-14

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

阳勇
2023-03-14

我能够通过不再在我的db.changelog-master.yaml文件中使用includAll选项来使用它。includeAll 选项是快速入门(并处理特定目录中的所有文件)的有用方法,但似乎不建议常规使用。如前所述。

这是我以前在<code>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 列将根据应用程序的执行方式而有所不同:

    < Li > < code > db/changelog/changes/v 0001 _ users . SQL 是从IntelliJ运行时该列的显示方式 < Li > < code > BOOT-INF/classes/db/changelog/changes/v 0001 _ users . SQL 是从可执行jar运行时该列的显示方式。

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

感谢其他的答案,帮助我找到了正确的方向!

 类似资料:
  • 我正在使用SpringFox的swagger实现。我想修改swagger-ui.html以获得一个自定义的头值。如何修改此文件?或者告诉spring fox使用备用文件?

  • 使用liquibase和springboot,创建了数据库变更日志,并能够用maven-liquibase-plugin(mvn liquibase:update)成功地运行它。我正在编写集成测试,其中需要以编程方式创建liquibase更改。 运行上述测试时出现以下异常。 java.lang.IllegalStateException:在org.springframework.test.cont

  • 问题内容: 假设我有一个整数集,并且我想增加集合中的每个整数。我该怎么做? 我可以在迭代时添加和删除集合中的元素吗? 在迭代原始集合时,是否需要创建一个新集合以将元素“复制并修改”到其中? 编辑:如果集合中的元素是不可变的呢? 问题答案: 您可以在迭代期间使用Iterator对象安全地从集合中删除;尝试在迭代时通过其API修改集合会破坏迭代器。Set类通过getIterator()提供一个迭代器。

  • 问题内容: 标题说明了一切。我在 SWIFT_MODULE_NAME 的构建设置中进行了 搜索 ,但没有发现任何问题。我也在网上搜索过,并且有对该名称的引用,但没有有关其定义的信息。 此外,我在Apple Docs中找不到任何提及SWIFT_MODULE_NAME的信息。 我确实知道这一点:它在“ Objective-C生成的接口头名称”构建设置中使用,并且可以通过双击设置值来查看: $(SWIF

  • 在我的Nativescript Angular 2 Typescript应用程序中,我希望有一个Nativescript加载任何包含html文本输入字段的远程网站(不受我控制)。 然后我想用我的NativeScript应用程序的值填充这些输入字段。 我以前在android studio中使用java完成过这项工作,在那里可以运行一些JS并修改webview的dom。但是,在没有运行特定于andro

  • 我想用liquibase变更集进行模拟数据的集成测试,如何使其不影响真实数据库?我从这里找到了部分想法,但我使用的是springboot,我希望有更简单的解决方案。