0. 引言
在开发周期较长,或许需求变更频频,涉及多版别发布的项目中,咱们常常遇到这样的问题:
- 改了表结构,开发环境履行了,忘记保存,发测验、生产环境时又要重写一遍DDL
- 多人开发,都改了表结构,无法自动更新到自己的本地库
- 新环境布置,之前改过的表结构,又要再改一遍
以上这些问题咱们都统称为数据库表结构版别办理,实际开发中不止是代码需求版别办理,咱们的数据库相同需求版别办理,杰出的版别办理,才干让咱们了解数据库的迭代改变,愈加灵活的应对多环境布置。
在搭档的推荐下,了解到了flyway这款工具,今日相同给大家分享下他的运用
1. flyway简介
flyway是一款根据java开发的,数据库移植组件,支持所有的JDBC数据库
源码地址:github.com/flyway/flyw…
官方文档:flywaydb.org/documentati…
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来做多版别的数据库结构办理,是比较方便和快捷的,去尝试下吧
项目源码: gitee.com/wuhanxue/wu…