1.前言

Flyway工具的入门和命令已经结束后,flyway还有一些高级特性。

2.可重复的迁移(Repeatable)

Flyway工具-命令一篇中,版本脚本是无法修改的。所以Flyway提供另外一个脚本是可以重复执行的。脚本的命令以R__开头,不用加版本号。

2.1案例

现在flyway是一个空库
①创建一个初始化脚本V1__init.sql 并执行 flyway migrate

  1. create table student(
  2. id int not null,
  3. name varchar(100) not null
  4. );

②创建一个可重复执行脚本 R__try.sql

  1. insert into student values('1','高溪');
  2. insert into student values('2','董路路');

③执行flyway migrate 并使用flyway info 查看
image.png
④不修改R__try.sql的内容,重复执行flyway migrate
数据库没有任何变化,版本也不变。
⑤将R__try.sql修改为如下内容

  1. insert into student values('3','花花');

⑥执行flyway migrate
image.png
脚本正常执行,并插入了一条 叫 “花花”的学生信息。

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目录下:

  1. show tables;

②随便编写一个初始化脚本V1__init.sql

  1. create table student(
  2. id int not null,
  3. name varchar(100) not null
  4. );

③执行flyway migrate
image.png
会执行show tables;

6.Dry Runs

这个特性的作用就是可以预览flyway migrate将会对数据库产生的影响,这个特性的使用也要花钱。
①flyway数据库清空,创建脚本V1__init.sqlflyway migrate

  1. create table student(
  2. id int not null,
  3. name varchar(100) not null
  4. );

②创建脚本V2__insert.sql

  1. insert into student values('1','高溪');

③执行如下命令

  1. flyway -teams migrate -dryRunOutput=dryrun.sql

在当前flyway目录中会有 dryrun.sql 文件生成。
image.png
内容为:

  1. -- -====================================
  2. -- Flyway Dry Run (2021-01-09 18:00:04)
  3. -- -====================================
  4. SET foreign_key_checks=1, sql_safe_updates=0;
  5. SET foreign_key_checks=1, sql_safe_updates=0;
  6. SET foreign_key_checks=1, sql_safe_updates=0;
  7. -- Executing: validate (with callbacks)
  8. -- ---------------------------------------------------------------------------------------
  9. CREATE TABLE `flyway`.`flyway_schema_history` (
  10. `installed_rank` INT NOT NULL,
  11. `version` VARCHAR(50),
  12. `description` VARCHAR(200) NOT NULL,
  13. `type` VARCHAR(20) NOT NULL,
  14. `script` VARCHAR(1000) NOT NULL,
  15. `checksum` INT,
  16. `installed_by` VARCHAR(100) NOT NULL,
  17. `installed_on` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  18. `execution_time` INT NOT NULL,
  19. `success` BOOL NOT NULL,
  20. CONSTRAINT `flyway_schema_history_pk` PRIMARY KEY (`installed_rank`)
  21. ) ENGINE=InnoDB;
  22. CREATE INDEX `flyway_schema_history_s_idx` ON `flyway`.`flyway_schema_history` (`success`);
  23. SET foreign_key_checks=1, sql_safe_updates=0;
  24. -- Source: sql\beforeMigrate.sql
  25. -- ------------------------------
  26. show tables;
  27. SET foreign_key_checks=1, sql_safe_updates=0;
  28. -- Executing: migrate (with callbacks)
  29. -- ---------------------------------------------------------------------------------------
  30. SET foreign_key_checks=1, sql_safe_updates=0;
  31. -- Executing: migrate -> v1 (with callbacks)
  32. -- ---------------------------------------------------------------------------------------
  33. -- Source: sql\V1__init.sql
  34. -- -------------------------
  35. create table student(
  36. id int not null,
  37. name varchar(100) not null
  38. );
  39. 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);
  40. SET foreign_key_checks=1, sql_safe_updates=0;
  41. -- Executing: migrate -> v2 (with callbacks)
  42. -- ---------------------------------------------------------------------------------------
  43. -- Source: sql\V2__insert.sql
  44. -- ---------------------------
  45. create table person(
  46. id int not null,
  47. name varchar(100) not null
  48. );
  49. 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);
  50. SET foreign_key_checks=1, sql_safe_updates=0;

此时,这个文件表明,如果你执行 flyway migrate 后会对数据库执行的脚本,这些脚本并未执行。只有当你运行flyway migrate时才会真正执行