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
时才会真正执行