作者:bug菌
✏️博客:CSDN、、infoQ、51CTO等
简介:CSDN|阿里云|华为云|51CTO等社区博客专家,历届博客之星Top30,年度人气作者Top40,51CTO年度博主Top12, | InfoQ | 51CTO等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈美妙屋」,欢迎你的参加!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量材料。…
✍️温馨提示:本文字数:1999字, 阅读完需:约 5 分钟
本文收录于《Spring Boot从入门到精通》,专门攻坚指数提高。
本专栏努力打造最硬核 Spring Boot 从零根底到进阶系列学习内容,均为全网独家首发,打造精品专栏,专栏继续更新中…欢迎咱们订阅继续学习。
环境阐明:Windows10 + Idea2021.3.2 + Jdk1.8 + SpringBoot 2.3.1.RELEASE
1. 前语
在咱们的认知中,咱们会运用 SVN 或 Git 进行代码的版别办理。可是,咱们是否好奇过,数据库也是需求进行版别办理的呢?
在每次发版的时分,咱们或许都会对数据库的表结构进行新增和改变,又或许需求插入一些初始化的数据。而咱们的环境不仅仅只要一套,一般来说项目会有dev、test、pred、prod四套环境,会对应 dev、test、prod 三个数据库。pred 环境,一般衔接 prod 数据库,做准出产的检验。
那么,就意味着咱们需求对 dev、test、prodD 数据库都做一遍初始化操作。“人,是体系最大的 BUG”。许多时分,咱们并不能确保像机器相同,每次都操作都正确,这就导致在不同的环境下,由于数据的每个版别的初始化,带来额外的检验成本。
甚至说,由于咱们常常是手动操作 dev 数据库,没有收拾一个完好清单,确保咱们在test、prod 数据库中履行相同的操作。
基于以上种种,假如咱们能像办理代码版别相同,来办理咱们的数据库版别,是不是这些问题能够得到很好的处理?答案是,绝大多数是的。
目前,技术社区现已提供了许多处理方案。比方:
- Flyway
- Liquibase
- dbdeploy
- SQL Source Control
- dbv
- MyBatis Migrations
在 Spring Boot 项目中,提供了对 Flyway 和 Liquibase 的内置支撑,所以在有数据库版别的需求时,肯定是引荐它两。
本文,我会对 Flyway 进行深入入门学习。这样,咱们在学习它的一起,能够有比较直观的运用感受,便利后续咱们对它们进行选型。
那么,详细怎么集成Flyway 呢?这将又会是干货满满的一期,全程无尿点不废话只抓要点教,具有非常好的学习效果,拿好小板凳预备就坐!希望学习的过程中咱们仔细听好好学,学习的途中有任何不清楚或疑问的地方皆可评论区留言或私信,bug菌将第一时间给予解惑,那么废话不多说,直接开整!Fighting!!
2. 环境阐明
本地的开发环境:
- 开发东西:IDEA 2021.3
- JDK版别: JDK 1.8
- Spring Boot版别:2.3.1RELEASE
- Maven版别:3.8.2
3.Flyway
3.1概念
Flyway 是一款开源的数据库版别办理东西。它能够很便利的在命令行中运用,或许在Java应用程序中引进,用于办理咱们的数据库版别。
在项目或产品中,很难一开始就把业务理清楚,把数据库表设计好,因此数据表也会在迭代周期不断迭代。在Java应用程序中运用Flyway,能快速有用地用于迭代数据库表结构,并确保布置到测验环境或出产环境时,数据表都是保持一致的。
详细介绍请看Flyway官方文档
3.2依靠包
假如你是运用的maven构建东西,那你直接将如下依靠增加到你项目的pom.xml中即可
<!-- 运用 Flyway -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
3.3运用flyway好处
在多人开发的项目中,咱们都习惯了运用SVN或许Git来对代码进行版别操控,首要的目的便是为了处理多人开发代码抵触和版别回退的问题。其实,数据库的改变也需求做版别操控,在日常开发中,咱们经常会遇到下面的问题,比方:
- 自己写的SQL忘了在一切环境中履行初始化;别人写的SQL咱们不能确定是否都在一切环境履行过了。
- 有人修正了现已履行过的SQL,希望再次履行。
- 需求新增环境做数据搬迁。
- 每次发版需求手动操控先发DB版别,再发布应用版别。
- 其它场景。
有了flyway,这些问题都能得到很好的处理。
4.集成Flyway
接下来,我就带着咱们实战怎么集成Flyway,具有很好的教学意义,同学们仔细听好好学。
4.1引进依靠包
首先需求在 pom.xml 文件中增加相应的依靠,示例代码如下:
<!-- 运用 Flyway -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
4.2装备sql脚本
然后在application.yaml或 application.properties 文件中装备数据库信息,并指定 SQL 脚本的位置,示例代码如下:
spring:
flyway:
enabled: true # 敞开 Flyway 功用
cleanDisabled: true # 禁用 Flyway 一切的 drop 相关的逻辑,避免呈现跑路的情况。
locations: # 搬迁脚本目录
classpath: db/migration # 装备 SQL-based 的 SQL 脚本在该目录下
check-location: false # 是否校验搬迁脚本目录下。假如装备为 true ,代表需求校验。此刻,假如目录下没有搬迁脚本,会抛出 IllegalStateException 反常
url: jdbc:mysql://localhost:3306/springboot_db?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8 # 数据库地址
user: root # 数据库账号
password: 123456 # 数据库暗码
留意: spring.flyway 装备项,设置 Flyway 的特色,然后能够被 FlywayAutoConfiguration 主动化装备。 每个装备项的效果,自己看下注释。 要点看下 locations 装备项,该装备设置了 SQL搬迁脚本地点目录。
4.3定义SQL脚本
在resources/db/migration 目录下,创建 V1.0__INIT_DB.sqlSQL搬迁脚本。详细项目位置截图如下演示:
sql脚本代码如下:
DROP TABLE IF EXISTS `cat`;
CREATE TABLE `cat` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`color` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
INSERT INTO `cat` VALUES (4, 'red', '波斯猫', 30);
INSERT INTO `cat` VALUES (5, 'blue', '蓝猫', 50);
INSERT INTO `cat` VALUES (6, 'green', '蓝白', 80);
4.4sql 脚本命名规范
对于 V1.0__INIT_DB.sql的命名上。Flyway是有明确规定的,约定如下:
Prefix 前缀: V为版别搬迁,U为回滚搬迁,R为可重复搬迁。
在咱们的示例中,咱们运用
V前缀,表明版别搬迁。绝大多数情况下,咱们只会运用V前缀。
Version 版别号: 每一个搬迁脚本,都需求一个对应一个唯一的版别号。而脚本的履行次序,按照版别号的次序。一般情况下,咱们运用数字自增即可。
在咱们的示例中,咱们运用
1.0。
Separator 分隔符: 两个_,即__。可装备,不过一般不装备。
Description 描述: 描述脚本的用途。
在咱们的示例中,咱们运用
INIT_DB。
Suffix 后缀: .sql。可装备,不过一般不装备。
规范命令举例:V1.0__INIT_DB.sql、V3.0__INIT_DB.sql.等
4.5发动项目测验
基本装备已具有,接下来便是验证成功的关键了,咱们重启项目查验FlyWay是否收效。
发动项目,履行日志如下所示:
假如看到打印了以上日志,阐明脚本履行成功了。
从发动日志中能够看出,Flyway 监测到需求运转版别脚原本初始化数据库,因此履行了V1.0__INIT_DB.sql脚本,从而创建了cat表,另外还主动创建了
flyway_schema_history表,用于记载一切版别演化和状况,其表结构如下(以 MySQL 为例):
查询flyway_schema_history表,发现增加了一条版别号为1.0的,运用V1.0__INIT_DB.sql 搬迁脚本的记载。
再次重启项目,能够看到,提示打印:Schema springboot_db is up to date. No migration necessary.意味着springboot_db是最新的,无需版别搬迁。
接下来,咱们在V1.0__INIT_DB.sql 搬迁脚本中增加一条 INSERT 操作:INSERT INTO cat VALUES (7, ‘pink’, ‘粉色猫’, 90);,再次发动项目,操控台会报如下过错:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Validate failed:
Migration checksum mismatch for migration version 2.0
-> Applied to database : -719082334
-> Resolved locally : 1598008518
完好报错截图如下:
这个过错的原因便是 Flyway 会给脚本计算一个 checksum 保存在数据库中,用于在之后运转过程中对比 sql 文件是否有变化,假如发生了变化,则会报错,也就避免了误修正脚本导致发生问题。
留意: 只要在第一次发动时会履行脚本,之后相同的脚本不会再次履行,能够经过flyway的插件主动履行一次SQL脚本;也能够经过删除数据库中的flyway_schema_history表或许表中的相应脚本履行成功的记载让项目下次发动时会再次履行一次脚本。
4.6演示修正脚本履行
接下来,咱们来演示一下:删除去V2.0__INIT_DB履行成功的记载,然后在搬迁脚本中再增加一条 INSERT 操作,咱们重启项目查验下成果:
成果如下:很明显脚本履行成功了。
对应flyway_schema_history表中也记载生成了一条记载。
4.7 总结
- Flyway 能够有用改善数据库版别办理方式,并且是一款 Java 开源的数据库搬迁办理东西,具有简便细巧的特色,能够无门槛快速集成到项目中。
- 对于咱们的Flyway要根据咱们的实际情况进行咱们的库表删除,不要忙目删除咱们的flyway_schema_history表。
总归,Flyway是一款 Java 开源的数据库搬迁办理东西,简便细巧,想了解更多的能够去官网检查文档学习,这儿就不一一赘述啦。
… …
ok,以上便是我这期的全部内容啦,假如还想学习更多,你能够看看如下的往期热文引荐哦,每天积累一个奇淫小常识,铢积寸累下去,你一定能成为令人敬仰的大佬。
「赠人玫瑰,手留余香」,咱们下期拜拜~~
5. 热文引荐
若想学习更多,能够参阅这篇专栏总结《2023最新首发,全网最全 Spring Boot 学习宝典(附思想导图)》,本专栏努力打造最硬核 Spring Boot 进阶系列学习内容,均为全网独家首发,打造精品专栏,专栏继续更新中。欢迎咱们订阅继续学习。
在入门及进阶之途,我必助你一臂之力,体系性学习,从入门到精通,带你不走弯路,直奔终点;出资自己,永远性价比最高,都这么说了,你还不赶紧来学??
6. 文末
我是bug菌,CSDN | 阿里云 | 华为云 | 51CTO等社区博客专家,历届博客之星Top30,年度人气作者Top40,51CTO年度博主Top12, | InfoQ | 51CTO等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈美妙屋」,欢迎你的参加!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量材料。












