1、什么是Flyway
Flyway是一款开源的数据库版本管理工具,Flyway可以独立于应用实现管理并跟踪数据库的变更。
Flyway根据自己的约定,不需要复杂的配置就可以实现数据的Migrate。
2、Flyway工作机制
Flyway的运行机制很简单,其中Migrate是Flyway工作流的核心功能,主要目的就是把数据库Schema迁移到最新版本。
Flyway每次在执行Migrate的时候会检测你的数据库中的flyway_schema_history表。
如果它没有检测到,会自动创建一张新的flyway_schema_history表用于版本控制。
当检测到你有新的版本需要迁移的时候,Flyway会逐一比对flyway_schema_history表中的已存在的版本记录,
如果有未应用的Migrations,Flyway会获取这些Migrations并按次序Apply到数据库中,否则不需要做任何事情。
另外,通常在应用程序启动时应默认执行Migrate操作,从而避免程序和数据库的不一致性。
3、Flyway规约
V20210402_01__create_tb_user.sql
首先我们需要一个大写的V作为版本的前缀标志,然后在后面紧跟着一个数字作为版本号,这个就是我之前提到的Flyway进行追踪的依据。
在版本号后面需要下划线作为分隔符用来分割版本号和说明(这里特别需要注意的是分隔符是两个下划线)。
4、集成SpringBoot
Spring Boot 将会自动管理Flyway的启动和运行。
然后Flyway会默认在你的项目src/main/resources/db/migration目录下查找SQL脚本。
将你的SQL脚本写完然后放入此路径下后就可以运行你的项目,Spring会自动创建Flyway的Bean来处理你的脚本。
POM
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>6.1.0</version>
</dependency>
YAML
spring:
# 数据库连接配置
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm-demo?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
username: xxx
password: xxx
flyway:
# 是否启用flyway
enabled: true
# 编码格式,默认UTF-8
encoding: UTF-8
# 迁移sql脚本文件存放路径,默认db/migration
locations: classpath:db/migration
# 迁移sql脚本文件名称的前缀,默认V
sql-migration-prefix: V
# 迁移sql脚本文件名称的分隔符,默认2个下划线__
sql-migration-separator: __
# 迁移sql脚本文件名称的后缀
sql-migration-suffixes: .sql
# 迁移时是否进行校验,默认true
validate-on-migrate: true
# 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
baseline-on-migrate: true
5、示例
目录结构
src
└─main
├─java
│ └─db
│ ├─bean
│ ├─core
│ └─testdata
└─resources
└─db
├─dev
├─envdata
├─migration
│ ├─V20210402_01__create_tb_user.sql
│ ├─V20210402_02__alter_user.sql
│ └─V20210402_03__inser_tb_user.sql
└─testdata
V20210402_01__create_tb_user.sql
create table tb_user (
user_id serial not null,
user_name varchar(36) not null
) ;
comment on table tb_user is '用户表';
comment on column tb_user.user_id is '用户ID';
comment on column tb_user.user_name is '用户名字';
V20210402_02__alter_user.sql
alter table tb_users add column sex varchar (4);
comment on column tb_user.sex is '性别';
V20210402_03__inser_tb_user.sql
truncate table tb_users;
COPY tb_users(
user_id
,user_name
,sex)
FROM STDIN WITH (FORMAT csv);
1,Yuguo,M
2,Zihan,F