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脚本文件并在记录表中添加执行记录,完成数据迁移:
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/