原文链接:https://dzone.com/articles/flyway-vs-liquibase
作者:Bartłomiej Żyliński
我相信没有必要描述为什么数据库迁移工具的使用对于使用关系数据库引擎的现代应用程序至关重要。我只会说它们可以让我们的生活更轻松,并帮助我们将复杂且重复的过程自动化。
通过本文的课程,我将深入了解两种最常见的开源迁移工具(即 Flyway 和 Liquibase)之间的异同。
两种最流行的迁移工具 Flyway 和 Liquibase 为数据库提供版本控制。 Flyway 使用 SQL 或 Java 来定义更改。相比之下,Liquibase 提供了以 SQL、XML、YAML 和 JSON 格式编写更改的灵活性。
Flyway详情
它的创建者(一家名为 Redgate 的公司)将其描述为一种开源数据库迁移工具,它更喜欢简单和约定而不是配置。
截至目前,它支持大多数当前使用的数据库引擎,如 Postgres、Oracle、SQL Server、DB2、H2、MariaDB 等。它还支持一些基于云的数据库服务,例如 Amazon RDS 或 Google Cloud SQL 或 Heroku。
该脚本可以用纯 SQL(支持许多方言)或 Java(主要用于更复杂的转换)编写。它有一个命令行客户端,但也提供 Maven 和 Gradle 插件。
更重要的是,它具有也适用于 Android 的 Java API。
对于那些使用 .NET 和 C# 的人,有一个名为 Evolve 的 Flyway 对应物,所以如果你有兴趣,可以查看这个。其 GitHub 页面的链接将在文章末尾。
Liquibase的详细信息
它始于 2006 年,是一个用于数据库迁移的开源工具。
它基于变更日志和变更集文件的概念,可以用 SQL、XML、YAML、JSON 编写。在那里,我们存储了我们想要在数据库结构中进行的所有更改。这些文件可进一步用于将这些更改应用于任何其他数据库实例。
Liquibase 支持后续数据库:Postgres、Oracle、DB2、H2、MariaDB、SQL Server、SQLite 等等。还支持许多基于云的数据库,例如 Azure SQL、Amazon RDS、Amazon Aurora。
您可以使用 Maven Gradle 甚至 Ant 等构建工具从 shell 运行 Liquibase 迁移脚本。此外,您可以生成纯 SQL 查询,这些查询可以由您的 DBA-s/Ops/DevOps 团队或负责您数据库的任何人进一步执行。
既然我们描述了这两种工具,我们就可以开始描述它们之间的相似之处和不同之处。让我们从这两个工具之间的相似之处开始。
Flyway 和 Liquibase 之间的相似之处
-
两者在某种程度上都是开源的,并免费提供部分功能,但也有提供更多功能的付费版本。
-
两者都可以使用普通的旧 SQL 来编写迁移脚本。
-
两者都强烈地“面向 Java”,并且还内置了对 Maven 或 Gradle 等基本构建工具的支持,以及与最常见的 Java 框架的集成,例如:Spring Boot。
-
两者都可以从命令行作为简单的 shell 脚本运行。
-
支持的数据库列表或多或少相似。支持的版本或驱动程序可能存在一些细微的差异,但总的来说,在这方面它们之间没有明显的差异。
-
两者都基于处理数据库更改的相同方法,即基于迁移的数据库交付。
-
这两种工具都试图实现 Martin Fowler 提出和解释的进化数据库的概念。
-
在这里,我们有这些工具之间的所有相似之处。现在我们可以继续描述它们之间的差异。
我将从跨数据库使用开始——跨多个数据库引擎运行相同脚本的可能性。
然后我将尝试回答我在专业工作中实际面临的问题:我可以使用哪种工具来比较同一数据库的两个实例并在它们之间生成差异。
在第三小段中,我将提到 Flyway Java 客户端,它似乎是一个非常强大和有用的功能。
第四段将是关于回滚的。我将通过深入探讨管理每个工具的更改顺序来结束这个比较。
Flyway 和 Liquibase 之间的差异
1、跨数据库使用
这两种工具都使您可以在纯 SQL 中编写迁移脚本,因此只要您使用它,就必须在跨不同数据库引擎进行迁移时自定义脚本。但是,您将有可能使用“魔术”或带有特定引擎中现有关键字的查询,这可以大大提高您的数据库性能。如果您决定使用 Liquibase 并以其他受支持的格式之一编写脚本,您应该能够轻松地跨不同数据库使用相同的脚本。
2、差异生成
您可以使用 Liquibase 生成差异,但不能使用 Flyway,即使使用付费版本也是如此。这是我们在项目中选择 Liquibase 而不是 Flyway 的主要原因之一。
3、一体化
正如我在描述相似之处的段落中提到的,这两种工具在这方面几乎相同。这里有一个非常重要的区别,我想提一下。 Flyway 有一个原生的 Java API。它旨在帮助我们进行更复杂的迁移,例如 BLOB 和 CLOB 更改或高级批量数据更改。这个 API 在某些情况下非常有用,可能是选择 Flyway 而不是 Liquibase 的原因。
4、回滚
现在是时候描述我们的工具如何处理回滚了。一方面,在 Liquibase 变更日志文件中设置它们相对容易。事实上,甚至在 changelog XML 结构中定义了一个特殊的字段用于回滚代码。另一方面,在 Flyway 中,它仅在付费版本中可用。不幸的是,我没有机会使用它,所以我无法在这里进行完整的比较。如果您愿意为您的工具付费,那么使用这个 Flyway 功能是值得的。然而,Liquibase 的付费版本据说对不同类型的回滚有更复杂的支持,所以它也值得一试。
5、变更单管理
我要提及和比较的最后一件事是管理更改的顺序。这两种工具都有完全不同的方法。 Flyway 基于线性数据库版本控制的概念。这意味着应用更改的顺序取决于迁移脚本名称。事实上,Flyway 迁移脚本有一个完整的命名约定,如果您希望它按预期工作,则必须遵循该约定。在 Liquibase 中,对我们的数据库实例应用更改的顺序是基于整个更改日志文件中的特定更改位置。您可以确定,如果您在更改日志中按某种顺序进行更改,您的更改将在数据库中以完全相同的顺序应用。
概括
我描述了 Liquibase 和 Flyway 之间的一些相似之处和不同之处,试图尽可能保持公正和客观。本文应该让您更深入地了解这两种工具的工作原理以及它们提供的可能性。选择哪一个是您的最终决定。