1.简介
flyway通过命令去管理数据库的版本,flyway的命令很少,总共就7个命令,我们在简介那一篇文章中已经认识到flyway migrate
和 flyway info
这两个命令了。下面针对这7命令依次演示其具体的作用和用法。
2.Migrate命令
2.1 作用
migrate 命令作用是扫描指定路径的数据库脚本文件,并在指定数据库中执行sql脚本。
2.2 SQL脚本命名方式讲解
我以具体的例子来说一下吧。
编写一个版本号为1的数据库脚本文件
V1__脚本名称.sql
编写一个版本号为1.1的数据库升级脚本文件
V1_1__脚本名称.sql
编写一个版本号为1.1.1的数据库升级脚本文件
V1_1_1__脚本名称.sql
总结:
①每个版本的sql脚本命名必须以 V
开头
②脚本名和版本号之间用 双_
间隔,例如 V1__脚本名.sql
③版本1.1对应的文件名应是 V1_1__脚本名.sql
即小版本号用 单个 _
间隔
2.3 案例
①本地Mysql中创建flyway数据库
②编写脚本V1__init.sql
放入flyway的安装目录下的sql目录下
create table student(
id int not null,
name varchar(100) not null
);
③执行命令 flyway migrate
flyway migrate -url=jdbc:mysql://localhost:3306/flyway?serverTimezone=GMT%2B8 -user=root -password=888888
每次执行命令都要指定数据库,太过麻烦,所以可以在其配置文件作如下配置:
在conf目录下有配置文件,在这里可以配置数据库连接、用户名和密码,具体配置项有:
flyway.url=jdbc:mysql://localhost:3306/flyway?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
flyway.user=root
flyway.password=888888
配置后只要执行 flyway migrate
即可
④为student表添加一些数据,编写脚本 V1_1__Insert_Some_Student.sql
insert into student values('1','高溪');
insert into student values('2','董路路');
⑤执行命令 flyway migrate
flyway migrate
这里只要执行flyway migrate即可,因为已经配置了数据库用户名和密码。
⑥查看版本信息
2.4 特性
2.4.1一个sql脚本不会重复执行
flyway migrate
只会执行那些比数据库版本高的sql脚本。
栗子1:当前数据库版本为 5 ,而现在有 1,2,3,4,5,6,7,8,9这些个版本的sql脚本。执行fly migrate
后。
1,2,3,4,5 版本的脚本不会执行
6,7,8,9版本的脚本会被执行
2.4.2不可以在已经执行的脚本中修改
在执行第二个插入学生数据的脚本后,发现少加了一条学生信息,如果在原来的V1_1__Insert_Some_Student.sql
中再添加一条insert ,结果脚本成为如下样式
insert into student values('1','高溪');
insert into student values('2','董路路');
insert into student values('3','花花');
此时执行 flyway migrate
ERROR: Validate failed: Migrations have failed validation Migration checksum mismatch for migration version 1.1 -> Applied to database : -1929625424 -> Resolved locally : -591265894. Either revert the changes to the migration, or run repair to update the schema history.
以本宝宝假六级英语水平翻译一下: 这次脚本迁移失败了,原因是 1.1版本的脚本的检验和不一样(就是1.1脚本内容不一致), 解决方式:1.要么把1.1版本脚本文件改成原来的 2.要么使用repair 命令 更新数据库历史版本。
总之,修改原版本的脚本文件后,是不可以执行 flyway migrate
的。
3.Info命令
我想查看当前的数据执行了哪些脚本,当前数据库是第几版了。如何查看?
①查看数据库中的 flyway_schema_history
表
②使用 flyway info
命令
flyway info
4.Validate命令
validate命令在每次migrate之前会被自动的调用,你也可以手动调用,其作用是:检查已执行的脚本是否发生变化。
比如对1.1脚本改动后,执行flyway validate
命令报的错误和2.4.2中一样。
5.Repair命令
在2.4.2中如果已执行的sql脚本被更改,会提示你使用repair
命令修复,这个命令是针对flyway_schema_history
表的。
其主要工作就是修改相应脚本的检验和使其与当前脚本的检验和一致。其实无任何意义,修改的脚本中的内容不会更新到数据库中。
①当前的数据库和脚本状态:flyway_schema_history表:
student表:
V1_1__Insert_Some_Student.sql
insert into student values('1','高溪');
insert into student values('2','董路路');
②同2.4.2一样修改V1_1__Insert_Some_Student.sql
insert into student values('1','高溪');
insert into student values('2','董路路');
insert into student values('3','花花');
③执行flyway migrate
报错
④执行 flyway repair
后:
执行flyway repair前:
执行flyway repair后:
再看报错信息
Migration checksum mismatch for migration version 1.1 -> Applied to database : -1929625424 -> Resolved locally : -591265894. Either revert the changes to the migration, or run repair to update the schema history.
小结:其实就是把flyway_schema_history 表
的 checknum修改为当前的校验和,但是新增的那条insert不会被执行即使你再次执行 flyway migrate
依旧是原来的两条数据:
6.Clean命令
这个命令很简单,是一条删库命令,执行flyway clean
的效果就是
执行前:
执行后:
注:不到最后时刻,一定慎用。。。
7.Undo命令
undo命令是为了撤销某个版本脚本而产生的。可是这个命令要钱、要钱、要钱
,这里我使用我的30天的免费试用来演示一下。
7.1试用30天的Team版本配置
①申请试用30天的版本证书
②查看如下文档进行配置
这里我的配置方式是在 /conf/flyway.conf目录中的flyway.license配置中放入自己的证书
flyway.licenseKey=FL014A577B79FB53D141CBD56694xxxx
之后执行命令时 flyway -teams 命令
以这种方式执行。
7.2 案例
当前的数据库已经是V1.1版本,V1.1版本的脚本就是插入2条数据:V1_1__Insert_Some_Student.sql
insert into student values('1','高溪');
insert into student values('2','董路路');
此时编写一个对应的脚本 U``1_1__Insert_Some_Student.sql
``
delete from student;
执行之后的情况如下:flyway -teams info
flyway_schema_history 表
7.3总结
①undo命令需要花钱才能用
②每次undo只能撤销最近一次版本
③undo前需要提供相应版本的撤销sql脚本,命名方式是前缀U
开头其他不变
8.Baseline命令
一个十分现实的问题,在使用flyway之前我的数据库中已经存在了好多的表结构和数据,此时想要引入flyway软件对现有数据库作版本管理。
我们可以模拟一下:
flyway数据库中已经有了一下两张表:
此时我相对flyway库引入flyway进行版本管理,
于是我编写了一个 V1__init.sql
脚本
create table student(
id int not null,
name varchar(100) not null
);
执行flyway migrate
的结果如下:
ERROR: Found non-empty schema(s)
flyway
but no schema history table. Use baseline() or set baselineOnMigrate to true to initialize the schema history table. 翻译: flyway数据库是非空表同时也没有schema history 表记录数据库历史版本,可以使用baseline进行初始化,或者设置 baselineOnmigrate 为true
于是,
方案一:使用 baseline命令
①执行 flyway baseline
②执行 flyway migrate
注意由于此时应将V1__init.sql
脚本修改为V2__init.sql
③观察flyway_schema_history 表
不难看出flyway baseline 将原来的表结构作为第一个版本初始化到 flyway_schema_history表中了,所以之后的脚本都要以2版本(大于1版本)开始。
方案二:设置baselineOnmigrate为true
只有执行 flyway -baselineOnMigrate=true migrate
即可。结果一致。