平时我们写代码一般使用Git等工具来进行版本管理,而Flyway可以理解为是用来进行数据库的版本管理的,它的功能是比较强大的,可以帮忙我们自动执行SQL,确保各个环境(开发、测试等)数据表的同步等,详细内容可以参考文档,这里简单介绍一下常用的使用方法
基本maven使用
引入依赖
1 2 3 4 5
| <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>7.0.0</version> </dependency>
|
创建SQL脚本并执行
在src/resources下创建 db/migration目录,在其中创建对应的SQL文件,其中又分为不同的文件类型,基于约定由于配置的原则,通过文件命名方式进行区分
版本迁移以V开头,只会执行一次;回退迁移以U开头,一般不使用;可重复执行迁移以R开头,每次修改后都会重新执行
版本迁移类型
在db/migration目录下创建版本迁移文件 V1__CreateUser.sql
1 2 3 4 5
| create table user ( id bigint not null auto_increment, name varchar(50) not null, primary key (id) )
|
以Java API方式调用执行
1 2 3 4 5 6
| public static void main(String[] args) { final Flyway flyway = Flyway.configure() .dataSource("jdbc:mysql://localhost:3306/test", "user", "password") .load(); flyway.migrate(); }
|
执行后会发现,之前空的库里面多了两张表(SQL已经执行)
1 2 3 4 5 6 7 8
| mysql> show tables; +-----------------------+ | Tables_in_test | +-----------------------+ | flyway_schema_history | // 用来记录数据库的各个版本信息 | user | // 创建的用户表 +-----------------------+ 2 rows in set (0.00 sec)
|
如果启动时没有flyway_schema_history(默认表名)表,则会初始创建一个
多次执行会发现,只有第一次会执行 V1__CreateUser.sql,后面就不会再次执行了
可重复执行迁移类型
在db/migration目录下创建版本迁移文件 R__AddUser.sql
1
| insert into user (name) values ("test");
|
执行后发现user表中多了一条记录,再次执行也是只有一条记录,只有当我们修改内容后才会再次执行
这时我们修改文件内容为
1
| insert into user (name) values ("test1");
|
再次执行代码发现SQL会再次执行
1 2 3 4 5 6 7
| mysql> select * from user; +----+-------+ | id | name | +----+-------+ | 1 | test | | 2 | test1 | +----+-------+
|
这时我们来看下历史记录表,总共有三次执行记录
1 2 3 4 5 6 7 8
| mysql> select * from flyway_schema_history; +----------------+---------+-------------+------+--------------------+------------+--------------+---------------------+----------------+---------+ | installed_rank | version | description | type | script | checksum | installed_by | installed_on | execution_time | success | +----------------+---------+-------------+------+--------------------+------------+--------------+---------------------+----------------+---------+ | 1 | 1 | CreateUser | SQL | V1__CreateUser.sql | -171442567 | root | 2020-10-01 23:54:35 | 23 | 1 | | 2 | NULL | AddUser | SQL | R__AddUser.sql | 517863463 | root | 2020-10-02 00:15:06 | 10 | 1 | | 3 | NULL | AddUser | SQL | R__AddUser.sql | -267384455 | root | 2020-10-02 00:15:47 | 11 | 1 | +----------------+---------+-------------+------+--------------------+------------+--------------+---------------------+----------------+---------+
|
Spring Boot使用
在Spring Boot项目中引入flyway依赖后,在配置文件中进行对应的配置,如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| spring.flyway.enabled=true
spring.flyway.clean-disabled=true
spring.flyway.table=flyway_schema_history
spring.flyway.out-of-order=false
spring.flyway.baseline-on-migrate=true
spring.flyway.baseline-version=0
spring.flyway.schemas=test
spring.flyway.validate-on-migrate=true
|
之后配置对应的数据源信息,在项目启动时会自动根据情况执行对应的SQL
这个主要是因为spring-boot-autoconfigure包中包含对应的Flyway配置