赞
踩
Flyway 是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话来讲,Flyway 可以实现开发者 Git 管理不同人的代码那样,管理不同人的SQL脚本,从而做到数据库同步。
按照上面测试的要求,需要对MySQL数据库进行测试,所以需要使用下列依赖信息:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.4</version>
</dependency>
</dependencies>
【额外注意:】必须增加数据库连接pom依赖!
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
否则会出现项目启动成功,但不会自动生成表的问题!
本次采取Springboot,只需要在application.yml
中配置对应的数据库连接即可。
server:
port: 80
spring:
datasource:
username: root
password: root
url: jdbc:mysql://106.55.137.66:3306/flyway?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver # mysql8的驱动,注意时区,如果是使用 MySQL 8 之前的驱动,可以是 com.mysql.jdbc.Driver
flyway:
locations: classpath:db/migration # 默认配置
enabled: true # 默认
baseline-on-migrate: true
clean-on-validation-error: false
启动类,只需要保证是Springboot应用即可:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class StartApplication {
public static void main(String[] args) {
try {
SpringApplication.run(StartApplication.class,args);
}catch (Exception e){
System.out.println(e);
}
}
}
首先需要在classpath
目录下,创建一个名为db.migration
的文件夹。
然后向该文件夹内,增加SQL脚本。编写SQL脚本需要注意以下几点:
仅需要执行一次
的脚本,以V
开头,后面跟上0~9
的数字组合,数字之间可以使用.
或者_
进行分割。然后再以两个下划线 __
进行分割,其后跟上文件名称
,最后以.sql
结尾。
如:
V1__create_user_ddl.sql
、V2__create_user.sql
。
重复执行
的SQL,则需要以R
开头。后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾。
如:
R__truncate_user_dml.sql
编写如下所示的测试脚本V1__create_user.sql
信息,如下所示:
CREATE TABLE IF NOT EXISTS `USER`(
`USER_ID` INT(11) NOT NULL AUTO_INCREMENT,
`USER_NAME` VARCHAR(100) NOT NULL COMMENT '用户姓名',
`AGE` INT(3) NOT NULL COMMENT '年龄',
`CREATED_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`CREATED_BY` varchar(100) NOT NULL DEFAULT 'UNKNOWN',
`UPDATED_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`UPDATED_BY` varchar(100) NOT NULL DEFAULT 'UNKNOWN',
PRIMARY KEY (`USER_ID`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
最初创建好数据库名后,此时数据库中的信息如下所示:
项目结构如下所示:
观察对应数据库结构信息,刷新数据库:
会出现两个表信息!
【疑问】为什么会出现两张表?
flyway_schema_history
是一个flyway管理各个版本关系的表,主要用于维护和管理开发者本地的脚本版本信息。
另一张表,则是刚刚的SQL脚本执行结果表,如下所示:
在classpath
文件夹中,新增一个R__add_user_info.sql
的脚本信息,其中SQL脚本如下所示:
insert into `user`(user_name,age) values('unknown',33);
重启项目
,观察结果:
【注意】这里的 R 重复执行脚本,并不是说是启动项目后不断执行!
而是,
每次启动项目
,都会重新校验对应的 R__add_user_info.sql 内容是否变更
,如果变更则重新执行
。
修改R__add_user_info.sql
中的信息,重新启动项目:
-- insert into `user`(user_name,age) values('unknown',33);
insert into `user`(user_name,age) values('xiangjiao',22);
重启项目:
正常开发中,字段信息的变更,往往不是很常见,这个要看需求。
如果因为需求的出现,导致需要在数据库表中增加或修改字段信息,此时flyway能轻松胜任。
之前的SQL脚本中,只设定有用户名、性别等信息,但如果想增加一个密码字段,此时则需要新增一个脚本。
V2__add_user_pwd.sql
,其中脚本内容如下所示:
ALTER TABLE `user` add column user_pwd varchar(11) default null comment '密码' after `age`;
向
user
表中增加字段user_pwd
,设定类型为varchar(11)
,默认为null
。
并要求在 age 字段 之后
。
重启项目,查看结果信息:
【批注:】这里居然插入到了最后 !!!
之前说到,如果是需要可重复执行,需要使用R
开头,编写SQL脚本。
但是如果在已运行成功的项目中,修改V
开头的脚本,再重新启动脚本会咋样?
原脚本信息为:
接下来向其中再加一个字段,注意这里是V
开头的脚本!
ALTER TABLE `user` add column user_position varchar(11) default null comment '位置';
重启项目,观察现象:
从控制台日志信息可以看出:
V
开头的脚本文件,在项目启动时,会去flyway_schema_history
表中匹配判断!
如果文本信息不匹配,则直接报错!!!!
将之前修改的V
文件还原,这次修改R
文件。
原文件信息为:
在其中新增一条数据信息:
重启项目,观察结果:
R
文件变更后
,启动并不会报错!
1、启动后,会判断
R
文件的内容信息是否发生变更。
2、如果未变更
,则不会新增数据!
3、如果存在变更
,则会将脚本再执行一遍
!
当增加脚本文件,但命名为V3_add_user_pwd.sql
。
注意:
当前V后只有一个_
!
insert into `user`(user_name,age) values('xiangjiao222',333);
当应用启动,则会出现如下所示的报错信息:
flyway的其他配置项:
flyway.baseline-description对执行迁移时基准版本的描述.
flyway.baseline-on-migrate当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
flyway.baseline-version开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
flyway.check-location检查迁移脚本的位置是否存在,默认false.
flyway.clean-on-validation-error当发现校验错误时是否自动调用clean,默认false.
flyway.enabled是否开启flywary,默认true.
flyway.encoding设置迁移时的编码,默认UTF-8.
flyway.ignore-failed-future-migration当读取元数据表时是否忽略错误的迁移,默认false.
flyway.init-sqls当初始化好连接时要执行的SQL.
flyway.locations迁移脚本的位置,默认db/migration.
flyway.out-of-order是否允许无序的迁移,默认false.
flyway.password目标数据库的密码.
flyway.placeholder-prefix设置每个placeholder的前缀,默认${.
flyway.placeholder-replacementplaceholders是否要被替换,默认true.
flyway.placeholder-suffix设置每个placeholder的后缀,默认}.
flyway.placeholders.[placeholder name]设置placeholder的value
flyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
flyway.sql-migration-prefix迁移文件的前缀,默认为V.
flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__
flyway.sql-migration-suffix迁移脚本的后缀,默认为.sql
flyway.tableflyway使用的元数据表名,默认为schema_version
flyway.target迁移时使用的目标版本,默认为latest version
flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
flyway.user迁移数据库的用户名
flyway.validate-on-migrate迁移时是否校验,默认为true
Flyway快速上手教程
mysql在表的某一位置增加一列、删除一列、修改列名
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。