> 文章列表 > flyway:数据库移植框架,再也不用担心历史版本表结构管理问题

flyway:数据库移植框架,再也不用担心历史版本表结构管理问题

flyway:数据库移植框架,再也不用担心历史版本表结构管理问题

0. 引言

在开发周期较长,或者需求变更频繁,涉及多版本发布的项目中,我们常常遇到这样的问题:

  • 改了表结构,开发环境执行了,忘记保存,发测试、生产环境时又要重写一遍DDL
  • 多人开发,都改了表结构,无法自动更新到自己的本地库
  • 新环境部署,之前改过的表结构,又要再改一遍

以上这些问题我们都统称为数据库表结构版本管理,实际开发中不止是代码需要版本管理,我们的数据库同样需要版本管理,良好的版本管理,才能让我们了解数据库的迭代变化,更加灵活的应对多环境部署。

在同事的推荐下,了解到了flyway这款工具,今天同样给大家分享下他的使用

1. flyway简介

flyway是一款基于java开发的,数据库移植组件,支持所有的JDBC数据库

源码地址:https://github.com/flyway/flyway

官方文档:https://flywaydb.org/documentation/getstarted/

flyway会在项目启动时,扫描指定路径下的所有sql脚本,同时会维护一张记录表flyway_schema_history,将扫描的sql脚本与flyway_schema_history中的记录对比,如果记录与指定路径下的sql脚本不一致(修改了历史的sql脚本),则会进行报错;

如果比对一致,则会执行记录中没有的sql脚本。

2. 使用

1、首先引入依赖,因为要连接数据库,所以还需要添加数据库驱动,这里以mysql为例

       <dependency><groupId>org.flywaydb</groupId><artifactId>flyway-core</artifactId><version>6.4.4</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version><scope>runtime</scope></dependency>

2、修改配置文件application.properties

spring:# 数据库连接配置datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/user_test?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456flyway:# 是否启用,默认为trueenabled: true# 编码格式,默认UTF-8encoding: UTF-8# sql脚本存放路径,默认db/migrationlocations: classpath:db/migration# sql脚本文件名前缀,默认Vsql-migration-prefix: V# sql脚本文件名分隔符,默认双下划线__sql-migration-separator: __# sql脚本文件名称的后缀,默认.sqlsql-migration-suffixes: .sql# 迁移时是否进行校验,确保历史脚本未篡改,默认truevalidate-on-migrate: true# 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表baseline-on-migrate: true

如上所示,如果我们都采用默认配置的话,实际上是不需要再声明配置了,只需要引入依赖即可。

3、根据上述配置,我们在src/main/resources/db/migration下,创建需要更新的sql脚本,注意脚本命名方式与上述配置的保持一致

这里我们创建一个V20230402__create_flyway_table.sql脚本:

CREATE TABLE `user_test`.`flyway`  (`id` int NULL,`name` varchar(255) NULL COMMENT '名称'
);
insert into `user_test`.`flyway` (id, name) values (1, '测试数据1');
insert into `user_test`.`flyway` (id, name) values (2, '测试数据2');

flyway:数据库移植框架,再也不用担心历史版本表结构管理问题

这里需要注意,如果是只执行一次的脚本,则以V命名开头,如果是需要每次都执行的脚本则可以以R命名开头,但这种情况一般很少用,另外还有以U开头的,用于回滚

官方详解:
flyway:数据库移植框架,再也不用担心历史版本表结构管理问题

4、这里有一个需要注意的事项,这里直接启动会发现不会加载sql脚本,需要再引入mybatis-plus最新版的依赖,估计是flyway和mysql本身的适配问题。

注意一定要是新版,截止文章时最新为3.5.3.1,供大家参考

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency>

5、启动项目前查看数据库,是没有对应的表的

flyway:数据库移植框架,再也不用担心历史版本表结构管理问题

6、启动项目,成功生效后可以看到日志

flyway:数据库移植框架,再也不用担心历史版本表结构管理问题

7、再查看数据库,可以看到新加的表和flyway记录表都添加上了

flyway:数据库移植框架,再也不用担心历史版本表结构管理问题

sql脚本中的insert语句也执行成功

flyway:数据库移植框架,再也不用担心历史版本表结构管理问题

总结

综上,使用flyway来做多版本的数据库结构管理,是比较方便和快捷的,去尝试下吧

项目源码:
https://gitee.com/wuhanxue/wu_study/tree/master/demo/flyway_demo