1.Flyway的作用

Flyway是一个数据库版本管理工具。支持Oracle、SQL Server、Mysql等数据库。

2.使用方式

①命令行方式: 需要下载安装 flyway 软件,便可以使用 flyway的命令,对数据库进行版本管理。
②JavaAPI方式:需要引入相关依赖,编写程序调用相关api执行flyway的命令
③Maven方式: 需要引入maven插件,通过maven命令执行flyway命令

2.1命令行方式

2.1.1下载Flyway工具软件(https://flywaydb.org/download

image.png

2.1.2解压后即可使用

image.png
注:这里作者使用的windows版本,linux、macos的版本也是一样的。

2.1.3在数据库中创建一个名叫 flyway 的数据库

  1. create database flyway;

2.1.4在解压目录中的sql目录创建1个SQL脚本,命名为V1__Create_person_table.sql内容如下:

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

2.1.5在解压后的目录中运行命令行执行如下命令:

  1. #flyway migrate -url=数据库url -user=数据库用户名 -password=数据库密码
  2. flyway migrate -url=jdbc:mysql://localhost:3306/flyway?serverTimezone=GMT%2B8 -user=root -password=888888

2.1.6查看数据库的状态

①数据库新增了两张表
person表示sql脚本执行后的结果,flyway_schema_history 是flyway用于记录数据库版本的表
image.png
②flyway_schema_history 表内容如下:
image.png

2.1.7通过flyway命令查看数据库版本信息

  1. #flyway info -url=数据库url -user=数据库用户名 -password=数据库密码
  2. flyway info -url=jdbc:mysql://localhost:3306/flyway?serverTimezone=GMT%2B8 -user=root -password=888888

展现的内容就是 flyway_schema_history这张表的内容
image.png

2.1.8为person表添加数据,在/sql目录中创建脚本V2__Add_people.sql 内容如下:

  1. insert into PERSON (ID, NAME) values (1, 'Axel');
  2. insert into PERSON (ID, NAME) values (2, 'Mr. Foo');
  3. insert into PERSON (ID, NAME) values (3, 'Ms. Bar');

2.1.9执行flyway命令

  1. flyway migrate -url=jdbc:mysql://localhost:3306/flyway?serverTimezone=GMT%2B8 -user=root -password=888888

2.1.10再次查看数据库中flyway_schema_history表的内容并通过flyway info查看

数据表:
image.png
命令行查看:

  1. flyway info -url=jdbc:mysql://localhost:3306/flyway?serverTimezone=GMT%2B8 -user=root -password=888888

image.png

2.2JavaApi方式

java-api的使用方式不需要安装具体的软件,只需要在你的项目中引入 数据库驱动和flyway依赖即可
具体配置如下:
pom文件:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.flywaydb</groupId>
  4. <artifactId>flyway-core</artifactId>
  5. <version>7.4.0</version>
  6. </dependency>
  7. <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
  8. <dependency>
  9. <groupId>mysql</groupId>
  10. <artifactId>mysql-connector-java</artifactId>
  11. <version>8.0.16</version>
  12. </dependency>
  13. </dependencies>

程序:

  1. public class FlywayDemo {
  2. public static void main(String[] args) {
  3. // 创建一个Flyway实例连接指定数据库
  4. Flyway flyway = Flyway.configure()
  5. .dataSource("jdbc:mysql://localhost:3306/flyway?serverTimezone=GMT%2B8",
  6. "root", "888888").load();
  7. // 开启数据迁移
  8. flyway.migrate();
  9. }
  10. }

sql脚本放置位置:
image.png
必须放在resources/db/migration下

2.3Maven方式

flyway提供了一个maven插件,引入后执行mvn flyway migrate 命令即可执行
pom文件:

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.flywaydb</groupId>
  5. <artifactId>flyway-maven-plugin</artifactId>
  6. <version>7.4.0</version>
  7. <configuration>
  8. #指定数据库url
  9. <url><![CDATA[jdbc:mysql://localhost:3306/flyway?serverTimezone=GMT%2B8]]></url>
  10. <user>root</user>
  11. <password>888888</password>
  12. <locations>
  13. #指定sql脚本的位置
  14. <location>classpath:db/migration</location>
  15. </locations>
  16. </configuration>
  17. <dependencies>
  18. <dependency>
  19. <groupId>mysql</groupId>
  20. <artifactId>mysql-connector-java</artifactId>
  21. <version>8.0.16</version>
  22. </dependency>
  23. </dependencies>
  24. </plugin>
  25. </plugins>
  26. </build>

sql脚本位置需要在指定的位置
image.png
执行mvn命令即可;
image.png

3.Flyway的工作方式

命令行方式为例。
①每次执行 flyway migrate flyway会在指定的数据库中寻找(flywayschema_history表),如果没有寻找到这个表并且数据库为空时(如果数据库不是空也没有flyway_schema_history表时需要额外执行其他命令),flyway会创建这样的一张表(flyway_schema_history表)。
②flyway创建了一张 flyway_schema_history 表后,会去扫描 /sql 目录中的脚本。发现有一个 V1__Create_person_table.sql 的脚本,这个脚本的的命名必须是V开头,并以2个下划线(’
‘)为前缀命名。这个脚本的意思就是 1版本。
③flyway扫描到了V1__Create_person_table.sql 的脚本后,会拿脚本的版本号(当前为1),去flyway_schema_history表 找当前数据库的版本号,如果当前数据库的版本号小于 1或者没有任何版本,则执行脚本 V1__Create_person_table.sql ,若flyway_schema_history表 中记录的当前数据库版本号大于1,就不会执行 脚本V1__Create_person_table.sql
④在flyway第一执行 migrate命令后,数据库的当前版本已经记录为版本1,这时如果你在 sql 目录下添加另一个脚本 V2__Add_people.sql,此脚本的意思时,版本2的数据库脚本。
⑤再次执行flyway migrate ,此时flyway再次扫描sql目录下的脚本文件,并在 flyway_schema_history表 中获取当前数据库的版本。最终发现数据库的版本为 1 ,所以flyway不会再去执行小于等于 版本1的脚本,即V1__Create_person_table.sql 的脚本不会再被执行,而V2__Add_people.sql脚本的版本的版本号为2,于是flyway会执行V2__Add_people.sql脚本,且记录在flyway_schema_history表并标识当前数据库的版本为2.

最后,如果所使用的数据库中已经有数据表了,需要先执行一次flyway的另一命令(flyway baseline),这条命令大概意思就是让现有表数据和结构作为一个初始版本记录在 flyway_schema_history表 。之后就可以正常使用 fly migrate进行数据库版本升级。