一、简介
1、什么是flyway?
Flyway是一款开源的数据库版本管理工具,它更倾向于规约优于配置的方式。 Flyway可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置。 Migrations可以写成SQL脚本,也可以写在Java代码中,不仅支持Command Line和Java API,还支持Build构建工具和Spring Boot等。 同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。
2、为什么要使用flyway?
在真实的项目开发中,我们每个人都会有一个应用软件和与其相联系的数据库。对于个人开发来说,这样就够了。但是,项目开发一般都不止一个人,因此一定会出现我在我的本地有一套软件和相应的数据库系统,我的另一个同事会在他的本地有一套他自己的软件和相应的数据库系统。我们需要面临的第一个问题就是我们两个人如何集成我们的数据库系统,之后还要处理如何将数据库系统迁移到测试环境和生产环境当中去。
二、使用
1、引入依赖
// 引入依赖
api("org.flywaydb:flyway-core:5.2.1")
// 解决包冲突问题
configurations {
all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds' // 设置快照版本缓存时间
resolutionStrategy.cacheDynamicVersionsFor 0, 'minutes' // 设置动态版本缓存时间
resolutionStrategy {
eachDependency { DependencyResolveDetails details ->
if (details.requested.group == 'org.flywaydb') {
details.useVersion "5.2.1" // 设置flyway的版本始终为5.2.1
}
}
}
}
}
2、进行flyway相关配置
@Configuration
@Slf4j
public class ZeusDbConfiguration {
private static final String MAGIC_NAME = "UT/master"; // 定位zeus.json中的UT/master。
static {
// 获取配置文件中的数据源(zeus.json)对象
DataSourceConfig dataSourceConfig = DataSourceConfigManager.INSTANCE.getDataSourceConfig(MAGIC_NAME);
// 进行flyway的相关配置
Flyway flyway = Flyway.configure()
.dataSource(dataSourceConfig.getJdbcUrl(),dataSourceConfig.getUsername(),dataSourceConfig.getPassword())
.locations("db/migration") // sql存放的路径
.baselineVersion("1_0")
.baselineOnMigrate(true)
.outOfOrder(false)
.encoding("UTF-8")
.load();
try {
flyway.migrate(); // 执行
} catch (FlywayException e) {
log.error("Flyway配置第一次加载出错", e);
try {
flyway.repair();
log.info("Flyway配置修复成功");
flyway.migrate();
log.info("Flyway配置重新加载成功");
} catch (Exception e1) {
log.error("Flyway配置第二次加载出错", e1);
throw e1;
}
}
}
}
3、创建目录以及sql文件
在类路径下创建多级目录,db/migration(这个可以自行配置,但是不建议更改)
将sql语句放入此目录下,这样项目在启动时,就会扫描到这些sql文件并按照 版本号 顺序 执行。 ==> 双下划线前为版本号,双下划线后为描述信息
项目启动时,自动按照版本号执行sql文件,并创建一个flyway_schema_history表,记录执行的sql信息
4、补充说明
字段名 | 描述 |
---|---|
installed_rank | 执行排名 ,值越低优先级越高,即版本越低越先执行 |
version | 执行版本 |
description | 描述信息 |
type | 文件类型 |
script | 文件名 |
checksum | 检验项,判断是否存在修改。存在修改会报错 |
installed_by | 执行的数据库用户 |
installed_on | 执行时间 |
execution_time | 执行文件所耗时间 |
success | 是否执行成功(0-失败,1-成功) |