1. 概述

在这个持续集成和自动化数据库开发的时代,我们需要进化式数据库设计的技术。像LiquibaseFlyway 这样的工具遵循这些原则,提供迭代开发的方法。本文将研究Liquibase和Flyway之间的异同。

请注意,没有一种工具适用于所有场景。每个工具都有其特定的优势。

2. Liquibase和Flyway的相似之处

由于Liquibase和Flyway都遵循进化式数据库设计的原则,它们提供了许多相似的功能。两者都:

  • 在一定程度上是开源的,帮助管理和跟踪数据库模式变更,并进行部署。
  • 使用版本化的迁移方法来处理数据库模式变更。
  • 基于Java,为Java框架如Spring BootVert.x 提供广泛支持。
  • 支持Maven和Gradle等构建工具的集成。
  • 可以通过提供的脚本独立于命令行运行。
  • 支持多种类型的数据库。

现在我们将讨论这些工具的具体差异。

3. Liquibase和Flyway的区别

3.1. 定义变更

Flyway使用SQL来定义一个变更。相比之下,Liquibase提供了灵活性,允许用不同的格式(如XML、YAML和JSON)指定变更。在Liquibase中,我们可以使用不依赖于特定数据库的语言工作,并轻松地将模式更改应用到不同类型的数据库。

Flyway围绕线性的数据库版本控制系统构建,每次有版本化的更改时都会递增。 这有时会在并行开发中导致冲突。Flyway脚本的文件名定义了迁移类型。例如,迁移应遵循前缀约定,如V(表示版本)、U(表示撤销)和R(表示可重复),后面跟着版本号,然后是两个下划线,接着是描述,最后是.sql扩展名,如V01__Add_New_Column.sql

Liquibase的迁移不需要遵循任何文件名约定。在Liquibase中,变更由一个称为主变更日志的管理器管理,它将包含所有的迁移。

3.2. 存储变更

两种工具都将已部署的变更存储在一个表中。 Flyway的迁移存储在数据库模式中,默认表名为flyway_schema_history。类似地,Liquibase将它的部署迁移存储在名为databasechangelog的表中。两者都支持重写默认配置以改变表名。

3.3. 变更的执行顺序

在Flyway中管理变更的顺序相对困难。在Flyway中,顺序取决于文件名中的版本号和迁移类型。相反,Liquibase使用一个名为master_changelog的单独文件,其中的变更按定义的顺序部署。

3.4. 回滚变更

现在,让我们讨论数据库迁移的一个重要方面:当一个不良变更导致应用程序出现灾难性问题时,需要回滚。 Liquibase提供了一种方法,可以回滚所有内容或撤销特定迁移(仅限付费版)。

Flyway也有撤销迁移,可以通过文件名以U开头,后面跟需要撤销的版本号部署。它的付费版还提供了更复杂的撤销功能。

两个工具都提供了不错的回滚功能,但仅考虑免费版本,Flyway提供了一个易于使用的解决方案。

3.5. 选择性部署变更

在某些情况下,我们需要将变更只部署到一个环境。在这种情况下,如果需要选择性部署,Liquibase胜出。Flyway也能够做到这一点,但你可能需要为每个环境或数据库设置不同的配置文件。使用Liquibase,我们可以轻松添加标签和上下文,以确保在特定位置进行部署。

3.6. 基于Java的迁移

两种工具都是强依赖于Java的,提供了基于Java的迁移。FlywayLiquibase 允许在Java文件中定义迁移。在某些场景中,这可能是有利的。

3.7. 数据库快照与比较

Liquibase允许用户获取当前数据库的状态快照。 我们可以使用这个状态来与另一个数据库进行比较。这对于故障转移和数据库复制等情况非常有用。而Flyway则不支持任何快照功能。

3.8. 条件性部署

Liquibase提供了一个额外的功能,称为预条件。 预条件允许用户根据数据库当前状态应用变更。只有当满足这些预条件时,才会执行变更集。

相比之下,Flyway不支持此功能。 但在大多数基于SQL的数据库中,我们可以通过存储过程实现条件应用。

4. 总结

在这篇文章中,我们比较了最常用的两个数据库迁移工具Liquibase和Flyway。在选择工具时,总是存在权衡。这两种工具之间没有明显的优劣之分。你可以根据你的应用需求选择Liquibase或Flyway,并确保满足大部分需求。