1、Flyway简介:
Flyway是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,Flyway可以像Git管理不同人的代码那样,管理不同人的sql脚本,从而做到数据库同步。
2、Flyway工作流程:
最简单的场景就是在空数据库中使用Flyway:
Flyway会先去定位模式历史表,因为是空数据库,所以flyway找不到历史表,会直接来创建历史表,默认的表名是flyway_schema_history。
这张表用来追踪数据库的状态。
然后Flyway会立即扫描文件系统或者是应用程序指定的SQL文件目录,目录里存放的SQL文件可以用sql或者java来编写。
这些SQL文件会根据版本号进行排序,并按照顺序来执行。
执行完一个SQL文件后,模式历史表的数据会进行相应的更新。
flyway_schema_history
有了元数据和初始化的状态之后,下面来看看更新数据库的版本。
Flyway会再一次扫描文件系统或者是应用程序指定的SQL目录,SQL文件会按照模式历史表来进行检查(注意,如果对于已经执行成功并记录到历史表中的SQL文件如果有修改,flyway会报错),如果SQL文件的版本低于或者等于历史表中已标记的版本,此SQL文件会被忽略。
剩下的高于历史表中版本的SQL文件会被标记为可以可用,
然后他们按照版本号排序并按照顺序执行
3、SpringBoot使用flyway组件
(1)pom中增加
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.4</version>
</dependency>
(2)注意druid需要升级为1.1.14版本及以上,旧版本和flyway同时使用有语句解析的bug。
(3)配置文件设置和说明
spring:
datasource:
druid:
filter:
wall:
config:
variant-check: false
none-base-statement-allow: true
comment-allow: true
multi-statement-allow: true
flyway:
enabled: true
# 如果数据库不是空库,需要设置成 true,否则启动报错
baseline-on-migrate: true
# 基准线版本版本号
baseline-version: 1
# 禁止清理数据库表
clean-disabled: true
locations: classpath:/sql/postgresql/init-sql
table: flyway-service-name
flyway.location是sql文件的目录,sql文件的命名规则: V[version]__[description].sql。
注意:名称中[version]和[description]之间是两个下划线!version只能有数字和"."构成,例如V1__init.sql,V1.1__data.sql。
flyway.table需要设置为flyway-[service-name]的规则,防止不同服务的之前的版本控制表冲突。
flyway.baseline-version 是基准线版本。基准线版本号默认为1。
举例说明基准线版本的使用:例如我们SQL文件目录下SQL文件为分别为V1__init.sql,V1.1__data.sql,基准线版本号设置分为以下两种情况:
①数据库中已经有了服务相关表和部分数据,我们需要保存这写结构和数据,就类似中途增加flyway的情况,我们可以把 baseline-version设置为1,这样V1__init.sql就不会执行,而V1.1__data.sql;如果设置为1.1,则V1__init.sql,V1.1__data.sql都不会执行以此类推。
②如果是最新的部署,数据中没有服务相关表结构和数据,也没有flyway的控制表,这时我们需要执行所以的sql文件,此时我们需要将 baseline-version设置为0.9,这样V1__init.sql,V1.1__data.sql都会执行。