1、flyway
flyway官方文档地址:https://documentation.red-gate.com/fd
对于不怎么看文档的我来说:
1)flyway是个管理数据库版本的工具,可以对不同环境的sql进行迁移操作。
2)优点:初始化、后期数据的管理、变更等,个人认为锦上添花的是一件执行数据脚本,方便快捷
对于数据库每当发布时会出现手动执行sql脚本进行升级数据库,中间经常出现一些漏写、错写情况,对数据库的版本与代码的版本不匹配,
2、文件命名规则
前缀:
V 代表版本变迁(Versioned Migrations),
U 代表撤销变迁(Undo Migrations),
R 代表可重复变迁(Repeatable Migrations),一般为可重复执行的sql语句。
版本号: 唯一的版本号,比如V1.0.1
分隔符: __ (两个下划线)
描述信息: 描述信息
后缀: .sql
== 其中,V开头的SQL执行优先级要比R开头的SQL优先级高==
命名eg: V1__insert.sql
3、版本号
- 0.0.1.1 比 0.0.1 高 - 0.0.10 和 0.0.010 一样高
4、Springboot集成Flyway
4.1 pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!--引入 Spring Boot Starter 父工程: --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.flyway</groupId> <artifactId>flyway</artifactId> <version>1.0-SNAPSHOT</version> <properties> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!--跳过测试类打包--> <skipTests>true</skipTests> <!-- spring-boot & spring cloud & alibaba --> <spring-boot.version>3.2.0</spring-boot.version> <spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version> <spring-cloud.version>2023.0.0</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- mysql数据库 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.32</version> </dependency> <!--导入MP包之后,删除原有的Mybatis的包 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus</artifactId> <version>3.5.4.1</version> </dependency> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>9.22.2</version> </dependency> <!--必须同时引入flyway-mysql,否则会报不支持mysql8.1版本数据库。 --> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-mysql</artifactId> <version>9.22.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.flywaydb</groupId> <artifactId>flyway-maven-plugin</artifactId> <version>8.0.4</version> <configuration> <url> 数据库地址</url> <user>数据库用户名</user> <password>密码</password> <driver>com.mysql.cj.jdbc.Driver</driver> </configuration> </plugin> </plugins> </build> </project>
4.2 application.yml
spring: # 数据库配置 datasource: url: username: password: driver-class-name: com.mysql.cj.jdbc.Driver flyway: # 开启数据库脚本备份 enabled: true # 默认1,从0开始可以规避版本1不执行问题 baseline-version: 0 # flyway 的 clean 命令会删除指定 schema 下的所有 table, 生产务必禁掉。这个默认值是 false 理论上作为默认配置是不科学的。 clean-disabled: false # SQL 脚本的目录,多个路径使用逗号分隔 默认值 classpath:db/migration locations: classpath:db/migration #是否允许无序的迁移,默认false out-of-order: false #编码 encoding: UTF-8 # 执行迁移时是否自动调用验证 当你的 版本不符合逻辑 比如 你先执行了 DML 而没有 对应的DDL 会抛出异常 validate-on-migrate: true # 设置为true,当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表 baselineOnMigrate: true
4.3 启动项 SpringbootFlywayApplication
package com.Flyway import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class SpringbootFlywayApplication { public static void main(String[] args) { SpringApplication.run(SpringbootFlywayApplication.class, args); } }
4.4 操作方式
4.4.1 启动springboot项目
4.4.3 插件启动
4.5 数据查看
5、注意事项
- 报错后需要删除flyway_schema_history中记录,否则启动失败;
- V文件的优先级高于R,假如三个V迁移脚本和一个R(无论新建还是修改)一起执行,其中一个V报错,则V会全部执行完成且记录到flyway_schema_history中,而R不执行且不记录,删除表中报错记录后,重新启动,则执行原错误V和未执行的R;
- 多个要执行的R中,如果出现了其中一个出现了错误,则在其后的R都不执行 R的执行顺序根据命名来进行排序;
- 一个文件中ddl并不由一个事务管理,比如创建三个表,中间创建表语句报错,则第一个表还是会创建成功并且提交事务;
- 同一个迁移文件下假设都是DML(即insert、delete、update),那么如果中间出现错误,所有的DML语句都会回滚;
- 已经执行过的迁移文件(V)不能修改,否则启动报错 版本号相同会报错(Found more than one migration with version ****);
- 删除sql文件后启动会报错