Flyway:数据库版本迁移工具的介绍
本文转载自:https://www.cnblogs.com/ywjy/p/10959475.html 更详细的可以看原文
Flyway的工作模式
这一节主要介绍Flyway是如何工作的,也可以理解为flyway的数据库升级方案。
Flyway可以对数据库进行升级,从任意一个版本升级到最新的版本。但是升级的依据是用户自己编写的sql脚本,用户自己决定每一个版本的升级内容。
Flyway不限定脚本里面的内容,但是对脚本文件的名称有一定的要求:
版本号可以使用小版本,如V1.1。
具体要求:
版本号和版本描述之间,使用两个下划线分隔。
版本描述之间,使用一个下划线分隔单词。
版本号唯一:不允许多个脚本文件有相同的版本号。
使用Flyway升级,flyway会自动创建一张历史记录表:flyway_schema_history。
这张表记录了每一次升级的记录,包括已经执行了哪些脚本,脚本的文件名,内容校验和,执行的时间和结果:
flyway在升级数据库的时候,会检查已经执行过的版本对应的脚本是否发生变化,包括脚本文件名,以及脚本内容。如果flyway检测到发生了变化,则抛出错误,并终止升级。
如果已经执行过的脚本没有发生变化,flyway会跳过这些脚本,依次执行后续版本的脚本,并在记录表中插入对应的升级记录。
所以,flyway总是幂等的,而且可以支持跨版本的升级。
如果你好奇,flyway如何检查脚本文件的内容是否有修改。你可以注意以下记录表中有一个字段checksum,它记录了脚本文件的校验和。flyway通过比对文件的校验和来检测文件的内容是否变更。
使用上面的方式,升级一个空的数据库,或者在一直使用flyway升级方案的数据库上进行升级,都不会又问题。但是,如果在已有的数据库引入flyway,就需要一些额外的工作。
flyway检测数据库中是否有历史记录表,没有则代表是第一次升级。此时,flyway要求数据库是空的,并拒绝对数据库进行升级。
你可以设置baseline-on-migrate参数为true,flyway会自动将当前的数据库记录为V1版本,然后执行升级脚本。这也表示用户所准备的脚本中,V1版本的脚本会被跳过,只有V1之后的版本才会被执行。
以下内容介绍基于Spring-Boot + Maven的集成方案:
step1:在maven中引入flyway依赖
<dependencies>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
...
</dependencies>
...
flyway-core即为我们所说的API包,除此之外,还要引入postgresql驱动包和spring-boot-starter-jdbc。
step2:配置application
按照常规的方式,在application.yml文件中配置spring.datasource系列:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/test?currentSchema=demo_flyway
driver-class-name: org.postgresql.Driver
username: postgres
password: postgres
spring为flyway准备了专属的数据源配置,但是在默认的情况下,可以直接使用spring.datasource的配置。
用户可以将脚本放在约定的位置:classpath:/db/migration,或者配置一个自定义的位置:
step3:在指定的目录编写脚本
如果用户没有特地设置脚本的位置,则应该在/db/migration创建脚本。否则,在对应的位置创建脚本。