1.前言
Flyway工具的入门和命令已经结束后,flyway还有一些高级特性。
2.可重复的迁移(Repeatable)
在Flyway工具-命令一篇中,版本脚本是无法修改的。所以Flyway提供另外一个脚本是可以重复执行的。脚本的命令以R__开头,不用加版本号。
2.1案例
现在flyway是一个空库
①创建一个初始化脚本V1__init.sql 并执行 flyway migrate
create table student(id int not null,name varchar(100) not null);
②创建一个可重复执行脚本 R__try.sql
insert into student values('1','高溪');insert into student values('2','董路路');
③执行flyway migrate 并使用flyway info 查看
④不修改R__try.sql的内容,重复执行flyway migrate
数据库没有任何变化,版本也不变。
⑤将R__try.sql修改为如下内容
insert into student values('3','花花');
⑥执行flyway migrate
脚本正常执行,并插入了一条 叫 “花花”的学生信息。
2.2小结
①可重复执行脚本命名:R__脚本名.sql
②可重复执行脚本可以有多个
③同一脚本,内容一旦变动,会再次执行这个脚本。
3.撤销迁移(Undo)
请参考Flyway工具-命令 的undo命令
4.程序做脚本(Java-base)
我们现在每次flyway migrate 都会去执行 *.sql 脚本,flyway提供使用程序定义脚本的方式,可是我认为基本用不到,如果需要查看请阅读 https://flywaydb.org/documentation/getstarted/advanced/java
5.回调(Callbacks)
这个是一个钩子,官方给出的案例是:当你每次执行 flyway migrate都想执行某个脚本动作,就可以使用这个特性。
案例:每次执行flyway migrate 命令前都要执行一个 show tables;的脚本
①定义一个 beforeMigrate.sql 脚本在 sql目录下:
show tables;
②随便编写一个初始化脚本V1__init.sql
create table student(id int not null,name varchar(100) not null);
③执行flyway migrate
会执行show tables;
6.Dry Runs
这个特性的作用就是可以预览flyway migrate将会对数据库产生的影响,这个特性的使用也要花钱。
①flyway数据库清空,创建脚本V1__init.sql 并flyway migrate
create table student(id int not null,name varchar(100) not null);
②创建脚本V2__insert.sql
insert into student values('1','高溪');
③执行如下命令
flyway -teams migrate -dryRunOutput=dryrun.sql
在当前flyway目录中会有 dryrun.sql 文件生成。
内容为:
-- -====================================-- Flyway Dry Run (2021-01-09 18:00:04)-- -====================================SET foreign_key_checks=1, sql_safe_updates=0;SET foreign_key_checks=1, sql_safe_updates=0;SET foreign_key_checks=1, sql_safe_updates=0;-- Executing: validate (with callbacks)-- ---------------------------------------------------------------------------------------CREATE TABLE `flyway`.`flyway_schema_history` (`installed_rank` INT NOT NULL,`version` VARCHAR(50),`description` VARCHAR(200) NOT NULL,`type` VARCHAR(20) NOT NULL,`script` VARCHAR(1000) NOT NULL,`checksum` INT,`installed_by` VARCHAR(100) NOT NULL,`installed_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,`execution_time` INT NOT NULL,`success` BOOL NOT NULL,CONSTRAINT `flyway_schema_history_pk` PRIMARY KEY (`installed_rank`)) ENGINE=InnoDB;CREATE INDEX `flyway_schema_history_s_idx` ON `flyway`.`flyway_schema_history` (`success`);SET foreign_key_checks=1, sql_safe_updates=0;-- Source: sql\beforeMigrate.sql-- ------------------------------show tables;SET foreign_key_checks=1, sql_safe_updates=0;-- Executing: migrate (with callbacks)-- ---------------------------------------------------------------------------------------SET foreign_key_checks=1, sql_safe_updates=0;-- Executing: migrate -> v1 (with callbacks)-- ----------------------------------------------------------------------------------------- Source: sql\V1__init.sql-- -------------------------create table student(id int not null,name varchar(100) not null);INSERT INTO `flyway`.`flyway_schema_history` (`installed_rank`, `version`, `description`, `type`, `script`, `checksum`, `installed_by`, `execution_time`, `success`) VALUES (1, '1', 'init', 'SQL', 'V1__init.sql', -1304895904, 'root', 4, 1);SET foreign_key_checks=1, sql_safe_updates=0;-- Executing: migrate -> v2 (with callbacks)-- ----------------------------------------------------------------------------------------- Source: sql\V2__insert.sql-- ---------------------------create table person(id int not null,name varchar(100) not null);INSERT INTO `flyway`.`flyway_schema_history` (`installed_rank`, `version`, `description`, `type`, `script`, `checksum`, `installed_by`, `execution_time`, `success`) VALUES (2, '2', 'insert', 'SQL', 'V2__insert.sql', 1698938723, 'root', 2, 1);SET foreign_key_checks=1, sql_safe_updates=0;
此时,这个文件表明,如果你执行 flyway migrate 后会对数据库执行的脚本,这些脚本并未执行。只有当你运行flyway migrate时才会真正执行
