开发人员在合作的时候经常遇到以下场景:
1.开发人员A在自己的本地数据库做了一些表结构的改动,并根据这些改动调整了DAO层的代码,然后将代码上传到svn或git等版本控制服务器上。此时如果开发人员B拉取了A的代码改动,在运行项目的时候很可能会报错,因为B的本地SQL数据库并没有修改。
2.在项目上线的时候,当服务器拉取的版本控制服务器的最新修改后,必须同时运行SQL数据库的修改脚本,如果忘了跑数据库脚本,那么会出现严重的问题。
传统的解决方案就是在一个固定的文件夹中,将需要跑的SQL脚本放在里面。开发人员在合作的时候,A修改了数据库,在B遇到问题的时候,可能需要交流沟通一下,去跑需要的脚本。在项目上线的过程中,也是运维人员在规定的文件夹中,找到需要跑的SQL脚本。运行它们。
Flyway等migration工具就是要把开发人员和运维人员从以上这些场景的繁琐工作中解放出来,如果使用maven的话,那么在项目编译(SpringBoot运行Application)的时候,SQL数据库的改动就自动进入数据库,只要启动成功,开发或者运维人员对SQL数据库的migrate过程是无感知的,项目依然可以照常运行。
1.引入flyway的依赖:
<!-- 添加 flyway 的依赖 --> <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency>application.yml 配置
spring: flyway: enabled: true # 迁移前校验 SQL 文件是否存在问题 validate-on-migrate: true # 生产环境一定要关闭 clean-disabled: true # 校验路径下是否存在 SQL 文件 check-location: false # 最开始已经存在表结构,且不存在 flyway_schema_history 表时,需要设置为 true baseline-on-migrate: true # 基础版本 0 baseline-version: 0 datasource: url: jdbc:mysql://127.0.0.1:3306/flyway-test?useSSL=false username: root password: root type: com.zaxxer.hikari.HikariDataSource在classpath下新建/db/migration文件夹,并创建sql脚本文件:
DROP TABLE IF EXISTS `t_user`; CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `username` varchar(32) NOT NULL COMMENT '用户名', `password` varchar(32) NOT NULL COMMENT '加密后的密码', `salt` varchar(32) NOT NULL COMMENT '加密使用的盐', `email` varchar(32) NOT NULL COMMENT '邮箱', `phone_number` varchar(15) NOT NULL COMMENT '手机号码', `status` int(2) NOT NULL DEFAULT '1' COMMENT '状态,-1:逻辑删除,0:禁用,1:启用', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `last_login_time` datetime DEFAULT NULL COMMENT '上次登录时间', `last_update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '上次更新时间', PRIMARY KEY (`id`), UNIQUE KEY `username` (`username`), UNIQUE KEY `email` (`email`), UNIQUE KEY `phone_number` (`phone_number`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='1.0-用户表';项目结构