在项目迭***中,难免会有更新数据库 Schema 的情况,比如添加新表、在表中增加字段或者删除字段等,那么当我对数据库进行一系列操作后,如何快速地在其他同事的电脑上同步?如何在测试/生产服务器上快速同步?
每次发版的时候,由于大家都可能有 sql 更改情况,这样就会有以下痛点:
- 忘记某些 sql 修改
- 每个开发人员的 sql 的执行顺序问题
- 重复更新
- 需要手动去数据库执行脚本
以上问题以及痛点可以通过 Flyway 工具来解决,Flyway 可以实现自动化的数据库版本管理,并且能够记录数据库版本更新记录。
Flyway 简介
Flyway 是独立于数据库的应用、管理并跟踪数据库变更的数据库版本管理工具。用通俗的话讲,Flyway 可以像 Git 管理不同人的代码那样,管理不同人的 sql 脚本,从而做到数据库同步,更多的信息可以在 Flyway 的官网上进行阅读学习。
另外 Flyway 支持很多关系数据库,具体如下所示:
下面我们在 Spring Boot 中集成 Flyway 来实现数据库版本控制。
Spring Boot 集成 Flyway
首先创建一个 SpringBoot 项目,然后在 pom.xml
加入如下依赖集成 Flyway:
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>5.2.4</version> </dependency>
然后在 application.yml
中写入 mysql 的配置及 Flyway 的相关配置(Flyway locations 默认读取当前项目下的 resources/db/migration
目录)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC spring.datasource.username=root spring.datasource.password=123 spring.flyway.locations=classpath:/db/migration/
接下来,在 resources/db/migration
目录下创建需要执行的 SQL 脚本即可。
其中,SQL 脚本命名规范如下:
- Prefix 前缀:V 代表版本迁移,U 代表撤销迁移,R 代表可重复迁移
- Version 版本号:版本号通常
.
和整数组成 - Separator 分隔符:固定由两个下划线
__
组成 - Description 描述:由下划线分隔的单词组成,用于描述本次迁移的目的
- Suffix 后缀:如果是 SQL 文件那么固定由
.sql
组成,如果是基于 Java 类则默认不需要后缀
那么,我们按照命名规范在 resources/db/migration
目录下,创建 V1.0__init_db.sql
SQL 迁移脚本,具体内容如下:
DROP TABLE IF EXISTS `user` ; CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `name` varchar(20) NOT NULL COMMENT '姓名', `age` int(11) DEFAULT NULL COMMENT '年龄', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `user` (`id`, `name`, `age`) VALUES ('1', 'wupx', '18');
最后启动项目,执行日志如下所示:
2020-05-07 12:41:29.126 INFO 13732 --- [ main] o.f.c.internal.license.VersionPrinter : Flyway Community Edition 5.2.4 by Boxfuse 2020-05-07 12:41:29.236 INFO 13732 --- [ main] o.f.c.internal.database.DatabaseFactory : Database: jdbc:mysql://localhost:3306/test (MySQL 5.5) 2020-05-07 12:41:29.287 INFO 13732 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 1 migration (execution time 00:00.009s) 2020-05-07 12:41:29.330 INFO 13732 --- [ main] o.f.c.i.s.JdbcTableSchemaHistory : Creating Schema History table: `test`.`flyway_schema_history` 2020-05-07 12:41:29.479 INFO 13732 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema `test`: << Empty Schema >> 2020-05-07 12:41:29.480 INFO 13732 --- [ main] o.f.core.internal.command.DbMigrate : Migrating