在本文中,我们将讨论两种最流行的基于Java的数据库重构工具Flyway和Liquibase 。 本文的目的是比较这些工具,并找出在哪种情况下最好使用哪种工具。

飞路
Flyway的概念以六个不同的团队为中心,以支持自动数据库重构和版本控制。 这些命令可以在构建过程中(使用Maven或Gradle生成)中从命令行执行,也可以使用API调用直接从Java代码执行。 执行这些命令时,需要提供用于连接到要重构的数据库的参数(URL,用户名,密码)。
主要命令称为migrate
,其执行的功能包含了数据库重构的全部要点:它使用sql脚本扫描每个特殊文件夹(每个脚本的文件名中都有版本号),并检查其中哪些已应用于目标数据库。 然后,它执行尚未应用到该数据库的那些操作。 例如,在发生冲突的情况下,如果自使用以来已更改了已应用的脚本,则Flyway会通过错误消息中断其操作。
Flyway的独特功能是迁移脚本不仅可以采用SQL格式,还可以采用Java代码形式。 第二个选项允许您使用复杂的逻辑实现动态迁移。 但是,应谨慎使用Java方法,因为如果这些迁移脚本出了问题,通常很难调试。
除了主要的migrate
命令之外,Flyway还具有其他命令,这些命令可以简化数据库重构过程。
info
命令显示了给定文件夹中所有可用的迁移脚本,并记录了其中已使用的迁移脚本,以及将仅应用于目标数据库的迁移脚本。
要检查应用于数据库的脚本是否已更改,请使用validate
命令。 自从将文件夹中已应用的脚本应用于数据库以来,我们已经知道该文件夹是否已更改,这对我们很有用,因为这可能意味着该脚本已应用于不同版本的不同数据库,这可能会导致问题。
如果您认为尽管validate命令显示了失败,仍应使用脚本,则可以运行repair命令。 它将重置Flyway使用的数据库表,以记录已经应用了哪些脚本(默认情况下,该表称为SCHEMA_VERSION)。
最后一个,但同样重要的是, clean
命令会完全清除选定的方案(如您所知,此命令应仅用于测试数据库)。
液基
Liquibase采用了另一种方法来实现数据库重构。 与仅支持SQL和Java格式的迁移脚本的Flyway不同,Liquibase允许您从SQL中抽象出来,从而从其特定实现中删除数据库重构。
Liquibase支持使用XML,YAML和JSON格式的迁移脚本来代替SQL脚本。 在这些脚本中,您可以在抽象级别定义对数据库的更改。 对于每次更改,Liquibase在XML,YAML和JSON中都有一个对应的元素。 例如,以YAML格式创建新数据库表的更改如下所示:
createTable: tableName: Customer columns: - column: name: name type: varchar(255) - column: name: address type: varchar(255)
诸如add column
, create index
或alter table
以及其他类似的外观。
在操作过程中,Liquibase会自动应用所有尚未使用的脚本,并且像Flyway一样,将其元数据保存在特殊的数据库表中。 与Flyway一样,Liquibase可以从构建工具的命令行中调用,也可以直接通过其Java API调用。
什么时候使用它们?
Flyway和Liquibase都支持专业数据库重构和版本控制所需的所有功能,因此您将始终知道要处理的数据库架构的版本以及它是否与您的软件版本匹配。 两种工具都与Maven和Gradle集成在一起,并在Spring Boot生态系统中集成在一起,因此数据库重构可以完全自动化。
Flyway使用SQL来识别数据库更改,因此您可以配置SQL脚本以有效使用项目中特定类型的数据库,例如Oracle或PostgreSQL。 另一方面,Liquibase引入了使用XML,YAML或JSON来检测数据库更改的附加抽象级别。 因此,Liquibase更适合需要在具有不同类型数据库服务器的不同环境中安装的软件。 但是,如果您需要对SQL的完全控制,则选择Flyway,因为它允许您使用完全自定义的SQL甚至Java代码来修改数据库。
这两种工具的共同点在于它们由一个人(来自翻译者:根据作者)支持 ,而不是由大型团队支持。 这可能会对这两个工具的未来开发产生负面影响,但这不是必需的。 在撰写本文时, Flyway GitHub存储库中的活动高于Liquibase存储库中的活动 。