Spring Boot 2.x基础教程:使用Flyway管理数据库版本 (2)

第五步:编写测试用例

@Slf4j @SpringBootTest public class Chapter311ApplicationTests { @Autowired private UserService userSerivce; @Test public void test() throws Exception { userSerivce.deleteAllUsers(); // 插入5个用户 userSerivce.create("Tom", 10); userSerivce.create("Mike", 11); userSerivce.create("Didispace", 30); userSerivce.create("Oscar", 21); userSerivce.create("Linda", 17); // 查询名为Oscar的用户,判断年龄是否匹配 List<User> userList = userSerivce.getByName("Oscar"); Assertions.assertEquals(21, userList.get(0).getAge().intValue()); // 查数据库,应该有5个用户 Assertions.assertEquals(5, userSerivce.getAllUsers()); // 删除两个用户 userSerivce.deleteByName("Tom"); userSerivce.deleteByName("Mike"); // 查数据库,应该有5个用户 Assertions.assertEquals(3, userSerivce.getAllUsers()); } }

注意由于Spring Boot 2.4应用的junit版本与之前Spring Boot 1.x版本中的不同,因此单元测试的编写略有区别,有兴趣的读者可以分别查看之前介绍文章和这篇文章中的单元测试的区别,这里就不细说了。

第六步:运行上面编写的单元测试,验证一下效果。

不出意外,单元测试运行ok的话

Spring Boot 2.x基础教程:使用Flyway管理数据库版本

连上数据库看看。此时应该多出了这两张表:

Spring Boot 2.x基础教程:使用Flyway管理数据库版本

user表就是我们维护在SQL脚本中要创建的表

flyway_schema_history表是flyway的管理表,用来记录在这个数据库上跑过的脚本,以及每个脚本的检查依据。这样每次应用启动的时候,就可以知道哪个脚本需要运行,或者哪个脚本发生了变动,运行基础可能不对,造成数据结构的混乱而阻止运行。

目标 2 的实现

有了上面的基础之后,我们来说说后续要做表结构的表变动该怎么操作,这也是之前读者出现问题最多的情况,所以在2.x版本教程中特地讲一讲。

首先,大家在开始使用Flyway之后,对于数据库表接口的变更就要关闭这几个途径:

直接通过工具登录数据去修改表结构

已经发布的sql脚本不允许修改

正确的表结构调整途径:在flyway脚本配置路径下编写新的脚本,启动程序来执行变更。这样可以获得几个很大的好处:

脚本受Git版本管理控制,可以方便的找到过去的历史

脚本在程序启动的时候先加载,再提供接口服务,一起完成部署步骤

所有表结构的历史变迁,在管理目录中根据版本号就能很好的追溯

下面根据一个实际需求来具体操作下。假设我们现在想对User表增加一个字段:address,用来存储用户的通讯地址,那么我们就需要这样操作实现。

第一步:创建脚本文件V1_1__alter_table_user.sql,并写入增加address列的语句

ALTER TABLE `user` ADD COLUMN `address` VARCHAR(20) DEFAULT NULL;

对于脚本文件名的基本规则是:版本号__描述.sql。当然如果你有更细致的要求,那么可以做更细致的文件名规划,具体细节读者可以查阅文末参考资料中的官方文档获取。

第二步:再次执行单元测试,在控制台中可以看到如下日志:

2021-01-11 16:58:12.025 INFO 37330 --- [ main] o.f.c.i.database.base.DatabaseType : Database: jdbc:mysql://localhost:3306/test (MySQL 8.0) 2021-01-11 16:58:12.063 INFO 37330 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 2 migrations (execution time 00:00.020s) 2021-01-11 16:58:12.075 INFO 37330 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema `test`: 1 2021-01-11 16:58:12.082 INFO 37330 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema `test` to version "1.1 - alter table user" 2021-01-11 16:58:12.113 INFO 37330 --- [ main] o.f.core.internal.command.DbMigrate : Successfully applied 1 migration to schema `test` (execution time 00:00.045s)

再查看一下数据中国的内容:

User表中已经有了Address列

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydyzj.html