数据库迁移工具 Flyway vs Liquibase (二)

3,118 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

🤞 个人主页:@青Cheng序员石头

我相信没有必要描述为什么数据库迁移工具的使用对于使用关系型数据库引擎的现代应用程序是至关重要的。我只想说,它们可以使我们的生活变得更加轻松,并帮助我们将复杂和重复的过程自动化。通过这篇文章,我将对两个最常见的开源迁移工具,Flyway和Liquibase之间的异同提供一些更深入的见解。

Flyway和Liquibase的相似之处

两者在某种程度上都是开源的,免费提供部分功能,但也有付费版本,提供更多的功能。并且两者都可以使用普通的旧SQL来编写迁移脚本。

两者都有很强的 "Java导向",也都内置了对Maven或Gradle等基本构建工具的支持,以及与最常见的Java框架的集成,例如Spring Boot。

两者都可以作为简单的shell脚本从命令行运行支持的数据库列表或多或少是相似的。在支持的版本或驱动程序方面可能会有一些小的差异,但总的来说,它们之间在这个领域没有明显的差异。

两者都是基于处理数据库变化的相同方法,即基于迁移的数据库交付。两种工具都试图实现Martin Fowler提出并解释的进化数据库的概念 Evolutionary Database Design

Flyway和Liquibase之间的区别

跨数据库使用

这两个工具都可以让你用纯SQL语言编写迁移脚本,所以只要你使用它,在进行不同数据库引擎间的迁移时,你就必须定制你的脚本。然而,你将有可能使用 "魔法 "或带有特定引擎中存在的关键字的查询,这可以大大增加你的数据库性能。如果你决定使用Liquibase并以其他支持的格式编写你的脚本,你应该很容易在不同的数据库中使用相同的脚本。

差异生成

你可以用Liquibase生成diff,但Flyway不能,即使是其付费版本。这也是我们在项目中选择Liquibase而不是Flyway的主要原因之一。

集成

正如我在描述相似之处的段落中提到的,这两个工具在这方面几乎是一样的。这里有一个非常重要的区别,我想提一下。Flyway有一个本地的Java API。它被设计用来帮助我们进行更复杂的迁移,比如BLOB和CLOB的变化或高级的批量数据变化。这个API在某些情况下是非常有用的,这可能是我们选择Flyway而不是Liquibase的原因。

回滚

现在是描述我们的工具如何处理回滚的时候了。一方面,在Liquibase的变更日志文件中,它们相对容易设置。事实上,在 changelog 的 XML 结构中,甚至有一个特殊的字段定义为回滚代码。另一方面,在Flyway中,它只在付费版本中可用。不幸的是,我没有机会使用它,所以我不能在这里做一个全面的比较。如果你愿意为你的工具付费,那么Flyway的这个功能是值得一试的。然而,Liquibase的付费版本据说对不同种类的回滚有更复杂的支持,所以也值得一查。

变更单管理

我想提及和比较的最后一件事是管理更改的顺序。在这里,两个工具都有一个完全不同的方法。Flyway是基于线性数据库版本管理的概念。这意味着,应用变化的顺序取决于迁移脚本的名称。事实上,Flyway的迁移脚本有一个完整的命名规则,如果你想让它按预期工作,你必须遵循这个规则。在Liquibase中,向我们的数据库实例应用变更的顺序是基于整个变更日志文件中的特定变更位置。你可以肯定的是,如果你把你的修改放在变更日志中的某个顺序,你的修改将以完全相同的顺序应用于你的数据库。

image.png

总结

我描述了Liquibase和Flyway之间的一些相似和不同之处,尽量做到不偏不倚和客观。这篇文章应该让你对这两个工具的工作原理和它们所提供的可能性有更多的了解。至于最终选择哪一个,是你自己根据数据的复杂性和系统需求进行决定。

如果对两者都不满意,那还有一些其它的替代品,请参照下图。

image.png


少年,没看够?点击石头的详情介绍,随便点点看看,说不定有惊喜呢?欢迎支持点赞/关注/评论,有你们的支持是我更文最大的动力,多谢啦!