Flyway
官方文档:https://flywaydb.org/documentation/
1.简介
1.1 Flyway是什么
Flyway是一款数据库迁移(migration)工具。简单点说,就是在部署应用的时候,帮你执行数据库脚本的工具。Flyway支持SQL和Java两种类型的脚本,你可以将脚本打包到应用程序中,在应用程序启动时,由Flyway来管理这些脚本的执行,这些脚本被Flyway称之为migration。
就目前而言,我们部署应用的流程大概是这样的:
- 开发人员将应用程序打包、按顺序汇总并整理数据库升级脚本
- DBA拿到数据库升级脚本检查、备份、执行,以完成数据库升级
- 应部署人员拿到应用部署包,备份、替换,以完成应用程序升级
引入Flyway之后的应用部署流程大概是这样的:
- 开发人员将应用程序打包
- 应部署人员拿到应用部署包,备份、替换,以完成应用程序升(Flyway将自动执行升级/备份脚本)
它仅基于 7 个基本命令: Migrate、 Clean、 Info、 Validate、 Undo、 Baseline和 Repair。
迁移可以用SQL(支持特定于数据库的语法(例如 PL/SQL、T-SQL 等))或Java (用于高级数据转换或处理 LOB)编写。
1.2 为什么要迁移数据库
许多项目仍然依赖于手动应用的 sql 脚本。有时甚至不是(这里或那里的快速 sql 语句来解决问题)。很快就会出现很多问题:
- 这台机器上的数据库处于什么状态?
- 此脚本是否已应用?
- 生产中的快速修复是否已应用于之后的测试中?
- 你如何设置一个新的数据库实例?
数据库迁移是重新控制这种混乱局面的好方法。
它们允许您:
- 从头开始重新创建数据库
- 随时清楚数据库处于什么状态
- 以确定性的方式从当前版本的数据库迁移到更新的版本
2.Flyway的工作原理
最简单的理解方式是:我们在一个空数据库上部署集成了Flyway的应用:
它将尝试定位其架构历史记录表。由于数据库是空的,Flyway 不会找到它,而是会 创建它。
-
Flyway将在这数据库中创建一张表,用于记录migration的执行情况,表名称默认为:flyway_schema_histor
-
紧接着,Flyway将开始扫描文件系统或应用程序的类路径以进行迁移。它们可以用 Sql 或 Java 编写。然后根据版本号对迁移进行排序并按顺序应用:
-
最后将执行结果写入flyway_schema_histor并校验执行结果
-
下次版本迭代时,提供新的migration,会根据flyway_schema_histor的记录执行新migration
每次需要演化数据库时,无论是结构 (DDL) 还是参考数据 (DML),只需创建一个版本号高于当前版本号的新迁移。Flyway 下次启动时,它会找到它并相应地升级数据库。
3.Flyway与Springboot项目整合使用
3.1 导入依赖
<!-- https://mvnrepository.com/artifact/org.flywaydb/flyway-core -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.1</version>
</dependency>
注意点:如果报下图所示的错误,是flyway与spring的版本冲突问题,解决方法将flyway降版本(可用5.2.1)
Description:
An attempt was made to call a method that does not exist. The attempt was made from the following location:
org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:65)
The following method did not exist:org.flywaydb.core.Flyway.migrate()
The method’s class, org.flywaydb.core.Flyway, is available from the following locations:jar:file:/F:/Maven/LocalWarehouse/org/flywaydb/flyway-core/8.0.5/flyway-core-8.0.5.jar!/org/flywaydb/core/Flyway.class
It was loaded from the following location:file:/F:/Maven/LocalWarehouse/org/flywaydb/flyway-core/8.0.5/flyway-core-8.0.5.jar
Action:
Correct the classpath of your application so that it contains a single, compatible version of org.flywaydb.core.Flyway
3.2 添加配置
# 配置flyway
spring.flyway.baseline-on-migrate=true
spring.flyway.enabled=true
spring.flyway.locations=classpath:db/migration
spring.flyway.table=flyway_schema_history
3.3 根据locations
建包,创建SQL文件
注意点:SQL文件名必须符合规范