Flyway:简化数据迁移以适应敏捷开发

429 阅读6分钟

Flyway是一个开源的数据库迁移框架,可以帮助开发人员自动化管理数据库结构和预置数据的变更,减少手动数据迁移,从而提高开发效率和数据库管理的可靠性。

敏捷开发是一种快速迭代的软件开发方法,需要快速地验证和测试新功能并快速部署。在这种情况下,数据库迁移工具是必不可少的。Flyway作为一种开源的数据库迁移工具,它可以轻松地管理数据库迁移,让开发人员专注于新功能的开发和部署。浪潮海岳物联网平台inIoT产品使用flyway工具,在产品开发和项目部署过程中进行了数据库迁移管理,提高了开发效率,减少了实施人员在更新迭代产品过程中的工作量,并且保障了数据库迁移的准确性和安全性。下面将从flyway原理、特点介绍flyway为何能适应敏捷开发模式,并简要介绍flyway的用法。

Flyway原理

Flyway的核心原理是基于数据库版本控制,将数据库的变更分为多个版本,每个版本都对应着一组DDL和DML语句,通过版本控制工具来管理这些语句的执行。这也契合了敏捷开发迭代的理念。

Flyway特点

  1. 简单易用:flyway 是一个轻量级的数据库迁移工具,易于安装和使用。它提供了简单的命令行界面和 API,使得开发人员可以轻松地集成到他们的项目中。例如springboot中,只需要引入flyway,然后在配置文件对一些配置项进行修改就可以进行数据迁移了。

  2. 易于跟踪: flyway 提供了版本控制,使得开发人员可以轻松地跟踪数据库的变化。这使得团队可以更加协作,同时也可以更好地理解和管理数据库的变化。

  3. 自动化: flyway 可以自动化执行数据库迁移,这使得敏捷开发团队可以更快地开发新功能,同时也可以更容易地进行测试和部署。在敏捷开发中不频繁使用手动数据迁移,也提高了数据库管理的可靠性。

  4. 可重复性: flyway 可以确保数据库迁移是可重复的,这意味着在不同的环境中使用相同的迁移脚本会产生相同的结果。这消除了很多与数据库变化相关的问题,从而提高了敏捷开发的效率和可靠性。

Flyway的用法

使用Flyway进行数据库迁移只需要以下几个步骤:

  1. 引入Flyway依赖:首先需要在项目中引入Flyway的依赖,可以通过Maven或Gradle来管理依赖。

  2. 配置数据源:Flyway需要通过数据源来连接数据库,因此需要在配置文件中配置数据源相关信息,如数据库URL、用户名和密码等。

  3. 创建迁移脚本:根据数据库变更的需要,创建相应的迁移脚本。迁移脚本必须按照严格的命名规则来命名,以便Flyway能够自动识别和执行。命名规则是“V{版本号}__{描述}.sql”,其中版本号是一个整数,描述是一个简短的描述,用于描述这个迁移脚本所做的变更。

  4. 执行迁移脚本:在应用启动时,Flyway会自动检测数据库中已经执行的版本,然后按照版本号的顺序执行尚未执行的版本,并在数据库中记录本次执行的版本号及结果,最终将数据库结构更新到最新版本。

  5. 在具体实践过程:配合springboot和maven,首先我们在pom中引用flyway:

然后在application.yml中对flyway进行配置,配置项路径spring-flyway:

主要就是脚本文件位置(locations),数据库中的表名(table)等,数据库的相关配置如果不配置会自动引用配置文件中的datasource配置,其他具体配置项释义可参见本文后续。配置文件配置好后,启用项目flyway会自动创建记录执行情况的数据表:

在使用时,开发人员可以在配置的脚本文件路径下创建sql脚本文件,文件命名格式

采用默认格式“V{版本号}__{描述}.sql”:

这样启用程序时,flyway会根据记录表中记录的版本号和执行情况选择要执行的sql脚本文件并在记录表中添加执行记录,完成数据迁移:

  1. Flyway配置项释义
flyway.url指定要连接的JDBC URL,必需项。
flyway.user指定连接数据库的用户名,必需项。
flyway.password指定连接数据库的密码,必需项。
flyway.driver指定JDBC驱动类名,如果不指定则会自动检测。
flyway.locations指定SQL脚本的位置,可以是classpath、文件系统路径或URL。
flyway.schemas指定要操作的数据库schema,可以是单个schema或多个schema,多个schema之间使用逗号分隔。
flyway.table指定flyway管理数据的表名,默认为schema_version。
flyway.outOfOrder指定是否允许执行不按顺序的migration,默认为false。
flyway.baselineOnMigrate指定是否在第一次执行migration时,执行baseline操作。
flyway.baselineVersion指定baseline的版本号,默认为1。
flyway.baselineDescription指定baseline的描述信息。
flyway.placeholderPrefix指定占位符的前缀,默认为${。
flyway.placeholderSuffix指定占位符的后缀,默认为}。
flyway.placeholders指定占位符的值,多个占位符之间使用逗号分隔。
flyway.sqlMigrationPrefix指定SQL脚本migration的前缀,默认为V。
flyway.sqlMigrationSuffix指定SQL脚本migration的后缀,默认为.sql。
flyway.repeatableSqlMigrationPrefix指定可重复的SQL脚本migration的前缀,默认为R。
flyway.target指定要升级到的目标版本号,默认为最新版本。
flyway.cleanOnValidationError指定在校验migration时出现错误时是否清空数据库,默认为false。
flyway.cleanDisabled指定是否禁用clean操作,默认为false。
flyway.encoding指定SQL脚本的编码,默认为UTF-8。
flyway.validateOnMigrate指定是否在执行migration时校验SQL脚本的正确性,默认为true。
flyway.ignoreMissingMigrations指定是否忽略缺失的migration,默认为false。
flyway.ignoreIgnoredMigrations指定是否忽略被忽略的migration,默认为false。
flyway.ignorePendingMigrations指定是否忽略未执行的migration,默认为false。
flyway.ignoreFutureMigrations指定是否忽略未来的migration,默认为false。
flyway.errorOverrides指定错误覆盖的规则,可以是warn、ignore、abort。
flyway.skipDefaultCallbacks指定是否跳过默认的callback,默认为false。
flyway.callbacks指定自定义的callback,多个callback之间使用逗号分隔。
flyway.skipDefaultResolvers指定是否跳过默认的resolver,默认为false。
flyway.resolvers指定自定义的resolver,多个resolver之间使用逗号分隔。
flyway.skipDefaultMigrations指定是否跳过默认的migration,默认为false。
flyway.mixed指定是否允许使用Java和SQL混合的migration,默认为false。
flyway.batch指定是否启用批处理操作,默认为false。
flyway.outputQueryResults指定是否输出查询结果,默认为false。
flyway.makeSchemas指定是否创建指定的schema,默认为true。
flyway.initSql指定初始化数据库时执行的SQL语句。
flyway.errorOnMissingBaseline指定是否在找不到baseline时报错,默认为false。
flyway.errorOnOutOfOrder指定是否在发现migration不按顺序时报错,默认为false。
flyway.errorOnValidate指定是否在校验migration时发现错误时报错,默认为false。

最后插个安利:inBuilder 低代码平台开源社区版,免费下载,免费使用,欢迎体验:inBuilder社区