java 带 Spring Boot 的liquibase变速器

nbnkbykc  于 2023-05-05  发布在  Java
关注(0)|答案(2)|浏览(136)

我正在将现有数据库迁移到liquibase管理。
我已经有更新记录了。该应用程序是一个Sping Boot 应用程序,我用liquibase-core更新了POM,并设置了Spring Liquibase属性。
我在一个空的数据库上测试了这个方法,结果和预期的一样,liquibase在应用程序启动时执行changelog,并维护DATABASECHANGELOG表。
现在我面临的问题是,数据库已经存在于所有其他环境中,我只想在完成liquibase迁移的第一个应用程序运行时,根据这些环境对变更日志进行基线检查。
我知道liquibase changelogsync命令是我需要的,我知道maven插件可以执行它。
然而,maven插件不是我的首选,因为我不想引入另一个组件,并希望有一种方法可以在应用程序启动时执行changelogsync,就像liquibase-core executes the liquibase on app startup一样,并使用spring application属性控制它。
我对此做了很多研究,但只找到了使用maven插件的答案。

6xfqseft

6xfqseft1#

我下载了liquibase-core的源代码,发现其中已经有执行changelogsync的帮助器方法。
基本上,所有CLI和插件的基础都是基于java的liquibase-core模块,因此有公共方法来完成所有可能的任务。它们只是不暴露于Spring模块。
我尝试了下面的changelogsync方法,它似乎做了需要做的事情。

edqdpe6u

edqdpe6u2#

你的主题中有两个独立的问题。
1.将现有数据库与新的更改日志文件同步。Liquibase不得尝试在现有数据库上运行这些更改,只能在新数据库上运行。
1.应用程序启动时,每次触发liquibase(不仅一次)。Liquibase使用DATABASECHANGELOG表标识,应用了哪些更改。您不需要尝试它只运行一次。
对于第一个问题,您有两个选择:
1.1使用changeLogSyncchangeLogSyncSQL。只有当你只有一个客户时才是合理的。
1.2一个更好的方法,采用新的更改日志文件(每个语句)与preConditions,如:

<preConditions onFail="MARK_RAN"><not><tableExists tableName="settings"/></not></preConditions>

1.要在应用程序启动期间使用Sping Boot 触发liquibase,官方网站上有2篇文章:
Using Liquibase with Spring Boot
Using Liquibase with Spring Boot and Maven

相关问题