Spring Boot 和 Liquibase 示例
Posted
技术标签:
【中文标题】Spring Boot 和 Liquibase 示例【英文标题】:Spring Boot & Liquibase by Example 【发布时间】:2018-07-25 12:29:39 【问题描述】:这里是 Spring Boot 和 mysql。试图让我的 Spring Boot 应用程序使用 Liquibase 进行数据库迁移,并在文档中查看 Spring Boot has built-in support for Liquibase。
但是在阅读了这些文档之后,我有几个相关的问题:
db/changelog/db.changelog-master.yaml
文件的基本用途是什么?是存储 Liquibase 配置(决定 Liquibase 的行为方式),还是我应该放置实际的顺序 SQL 更改(“迁移”)本身?
理想情况下,我希望有一个 src/main/resources/migrations
目录并将我的迁移更改存储为单独的 SQL 文件,如下所示:
src/main/resources/migrations/001-schema.sql
src/main/resources/migrations/002-init.sql
src/main/resources/migrations/003-changing-account-types.sql
...等。 是否可以通过 Spring Boot 配置 Liquibase 来执行此操作?
Spring Boot 何时运行这些 Liquibase 迁移?在应用程序启动时?如果 Spring Boot 应用程序实际上运行在一个节点集群上(比如负载平衡 URL 后面的 5 个节点),该怎么办? Spring Boot 会在每个节点上运行 5 次 Liquibase 吗?或者它是否以某种方式感觉到一个节点是“主迁移器”等?
【问题讨论】:
【参考方案1】:db/changelog/db.changelog-master.yaml
文件是使用默认配置时在应用程序启动时执行的文件。在该文件中,您可以有顺序的 SQL 更改以及对其他文件的包含。例如,该文件可能包含这样的内容(xml 语法)
<include file="migrations/001-schema.sql"/>
<include file="migrations/002-init.sql"/>
<include file="migrations/003-changing-account-types.sql"/>
你会得到你想要的配置。
关于您的第二个问题 - 是的,它们在启动时应用。如果它在节点集群上运行,它们将分别检查状态并将更改应用到数据库(如果尚未应用)(databasechangelog 和 databasechangelock 表用于此目的,它们确保更改只应用一次)
yaml 语法示例
databaseChangeLog:
- include:
file: migrations/001-schema.sql
- include:
file: migrations/002-init.sql
- include:
file: migrations/003-changing-account-types.sql
【讨论】:
感谢@Janar (+1) 关于<include file .../>
操作的一个简单问题。你是说我可以将它们添加到db.changelog-master.yaml
文件中吗?我发现 evidence here on SO 不能在 YAML 文件中包含文件。有任何想法吗?再次感谢!
是的,您可以将它们添加到db.changelog-master.yaml
文件中。该答案要么已过时,要么不适用于 liquibase。我将语法示例更改为 .yaml 文件一(上一个用于 .xml 文件)以上是关于Spring Boot 和 Liquibase 示例的主要内容,如果未能解决你的问题,请参考以下文章
具有 Liquibase 重载属性的 Spring-boot
确保 spring boot 和 liquibase 接收和处理 SIGTERM
使用 H2 数据库和 Liquibase 配置 Spring Boot
使用 Liquibase 的 Spring Boot 未在 Docker 中执行