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.Driver
url: jdbc:mysql://localhost:3306/user_test?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
flyway:
# 是否启用,默认为true
enabled: true
# 编码格式,默认UTF-8
encoding: UTF-8
# sql脚本存放路径,默认db/migration
locations: classpath:db/migration
# sql脚本文件名前缀,默认V
sql-migration-prefix: V
# sql脚本文件名分隔符,默认双下划线__
sql-migration-separator: __
# sql脚本文件名称的后缀,默认.sql
sql-migration-suffixes: .sql
# 迁移时是否进行校验,确保历史脚本未篡改,默认true
validate-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');
这里需要注意,如果是只执行一次的脚本,则以V
命名开头,如果是需要每次都执行的脚本则可以以R
命名开头,但这种情况一般很少用,另外还有以U
开头的,用于回滚
官方详解:
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、启动项目前查看数据库,是没有对应的表的
6、启动项目,成功生效后可以看到日志
7、再查看数据库,可以看到新加的表和flyway记录表都添加上了
sql脚本中的insert语句也执行成功
总结
综上,使用flyway来做多版本的数据库结构管理,是比较方便和快捷的,去尝试下吧
项目源码:
https://gitee.com/wuhanxue/wu_study/tree/master/demo/flyway_demo