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) 关于&lt;include file .../&gt; 操作的一个简单问题。你是说我可以将它们添加到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 中执行

Liquibase / Spring Boot / Postgres - 模式名称不起作用

将 liquibase 添加到现有 Spring Boot 项目的正确方法