天天看点

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

作者:inBuilder低代码平台

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:

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

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

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

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

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

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

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

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

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

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

6. 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 低代码平台开源社区版,免费下载,免费使用,欢迎体验:https://ibc.inspures.com/

继续阅读