【.com速译】众所周知,对于各类使用关系型数据库引擎的应用来说,数据库迁移工具的选择是至关重要的。它们不仅可以让各种复杂、重复的流程更加自动化,也可以让我们更轻松、更准确地完成各种大规模的迁移任务。下面,我将介绍和比较两种最常见的开源迁移工具——Flyway和Liquibase,以便大家在实际项目中做出合理的选择。Flyway简介Flyway是Redgate带来的开源数据库迁移工具。该工具侧重于规则的简单性,而不是繁琐的配置。目前支持Postgres、Oracle、SQLServer、DB2、H2、MariaDB等大多数主流数据库引擎。同时,Flyway还可以支持AmazonRDS、GoogleCloudSQL、Heroku等云端业务数据库服务。该工具中使用的脚本可以用纯SQL(支持多种SQL语法)或Java(主要用于更复杂的转换)编写。同时,它带有命令行客户端和支持Maven和Gradle的插件。此外,其JavaAPI也适用于Android系统。Flyway的Evolve非常适合习惯使用.NET和C#的用户。因此,如果您对此感兴趣,请查看本文末尾列出的GitHub链接页面。Liquibase简介Liquibase作为2006年推出的可用于数据库迁移的开源工具,是基于变更日志(changelog)和变更集(changesets)文件的相关概念实现的。这些文件可以用SQL、XML、YAML和JSON编写。他们通过存储对数据库结构的更改来实现这一点,因此它们可以应用于任何其他数据库实例。目前Liquibase支持的数据库类型包括:Postgres、Oracle、DB2、H2、MariaDB、SQLServer、SQLite。同时,它还支持许多基于云的数据库如:AzureSQL、AmazonRDS、AmazonAurora。您可以使用Maven、Gradle甚至Ant等构建工具从shell运行Liquibase的迁移脚本。此外,您可以生成一次纯SQL查询,以便您的DBA、Ops、DevOps团队或任何负责数据库的人可以进一步执行此类查询。了解了上述两个工具的基本概念后,我们来讨论一下它们之间的相同点和不同点。Flyway和Liquibase之间的相似之处在某种程度上,两者都是开源的,并且免费提供各种功能。当然,它们也都有提供更高级功能的付费版本。两者都可以使用简单、传统的SQL来编写迁移脚本。两者都是完美的“Java友好型”,并且都内置了对Maven和Gradle等基本构建工具的支持,以及与最常见的Java框架(如SpringBoot)的集成。两者都可以从命令行运行简单的shell脚本。虽然两者支持的数据库版本和驱动可能会有一些细微的差别,但总体来说,它们可以支持的数据库类型大致相似。两者在处理数据库变化时使用了相同的方法,即:基于迁移的数据库交付。这两种工具都实现了MartinFowler提出并解释的进化数据库的概念(有关详细信息,请参见本文末尾的链接)。Flyway和Liquibase之间的差异让我们讨论Flyway和Liquibase在跨多个数据库引擎运行相同脚本方面的差异。首先,我们会遇到一个实际问题:如何为实例产生差异(diffs)。您会看到我们可以直接使用Liquibase生成相关差异;我们不能用Flyway做到这一点,甚至不能用它的付费版本。这也是我们在项目中经常选择Liquibase而不是Flyway的主要原因之一。其次,让我们看看Java客户端。Flyway有一个原生的JavaAPI,可以帮助我们进行更复杂的迁移,比如BLOB和CLOB的更改,以及高级的批量数据修改。这些功能在某些受限制的迁移场景中非常有用。所以这反过来也成为了用户选择Flyway而不是Liquibase的主要原因之一。接下来,让我们讨论一下这两个工具如何处理回滚。我们设置Liquibase的changelog文件相对容易。事实上,变更日志XML结构甚至为回滚代码定义了一个特殊字段。Flyway仅在其付费版本中提供回滚处理。因此,如果您不介意使用付费工具,可以考虑使用Flyway的相关功能。当然,据说付费版的Liquibase对不同类型的回滚支持更完善。如果你有时间和精力,可以尝试一下。最后,让我们看一下变更单的管理。这两种工具对此有完全不同的方法。Flyway采用了线性数据库版本控制的理念。这意味着更改的应用顺序取决于迁移脚本的命名顺序。事实上,Flyway的迁移脚本有着完整的命名规范。如果您希望它按预期执行,则必须遵循此规则。而在Liquibase中,对数据库实例的更改顺序是基于整个更改日志文件中的特定更改位置。换句话说,如果您按照特定顺序将更改放入更改日志中,那么对数据库的更改也将以完全相同的顺序执行和完成。总结综上所述,我们对Flyway和Liquibase这两款数据库迁移工具进行了综合比较。总的来说,Flyway的优势在于其迁移脚本的可读性更强。如果你对SQL非常熟悉,那么使用起来会更加方便流畅。当然,它的缺点是不能跨平台使用。Liquibase正好相反。它的优点是可以跨平台使用。它的缺点是由于其强大的功能,我们可能需要花费一定的精力去维护它的迁移脚本。相关链接MartinFowler的《数据库重构(Evolutionary Database)》GitHub上的Evolve页面Liquibase支持的数据库完整列表Flyway支持的数据库列表译者和原文出处为.com]
