Flyway数据库版本管理工具的使用
在团队开发当中,有可能每个人都是使用自己本地的数据库。当数据库的表或者字段更新时,往往需要告知团队的其他同事进行更新。我记得第一个项目进行字段管理的时候是将自己的脚步拿出来放到项目某个文件夹下面,如果结构变了告诉其他同事拉下来之后执行下脚本文件。还有一种方式是改完之后告诉其他人哪个表字段做了改动,脚本都没放,这种方式也使用过···
Flyway数据库版本迁移工具可以解决该问题。每当我们更新数据库的时候,只需要添加SQL文件到指定目录中。
Flyway的流程大概是在数据库创建一个表,专门记录已更新的SQL文件。当我们下次执行时则不会执行已记录并且执行成功的SQL文件,如果没有执行过sql脚本会执行脚本并且记录到自己的表中。这种方式对开发、对线上系统的升级就非常方便了。当然flyway还有其他非常方便的功能,都是可以配置的。
github地址:https://github.com/flyway/flyway
而且我记得之前在一个项目是mybatisPlus些的,为了便于建表还引入了JPA进行建表,其实用flyway也可以,放一个初始化脚步,系统启动的时候自动执行脚步即可。
flyway使用可以命令行、Java、Maven等,也和spring做了整合。下面研究在springboot项目中的使用。
1. pom引入相关依赖
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>6.3.3</version> </dependency>
2.application配置
# FLYWAY (FlywayProperties) spring.flyway.url = jdbc:mysql://127.0.0.1:3306/media?useUnicode=true&characterEncoding=UTF-8 spring.flyway.user = root spring.flyway.password = 123456 # 存放flyway信息的表 spring.flyway.table = flyway_schema_history spring.flyway.enabled = true # 存放数据库脚本的位置 spring.flyway.locations = classpath:db/migration spring.flyway.clean-disabled = false spring.flyway.baseline-on-migrate = true # 允许乱序执行 spring.flyway.out-of-order= true # 前缀后缀 spring.flyway.sql-migration-prefix=V spring.flyway.sql-migration-separator=__ spring.flyway.validate-on-migrate=false
上面配置了数据库连接信息;
spring.flyway.table 指定存放flyway记录版本信息的表;
spring.flyway.locations 指定存放脚本文件的位置。classpath在boot项目中就是resources目录
sql-migration-prefix和sql-migration-separator指定版本前缀和版本号和描述的分隔符
关于更多的配置参考:https://flywaydb.org/documentation/configuration/configfile
3. 建立sql文件
这里说明下sql文件的命名。V版本号__描述.sql 版本号默认是1 (注意这里的下划线是两个),而且版本号不能重复。描述就是你本次sql改动是做什么了简单说明下。
4.启动项目自动建表
启动项目可以看到自动建的表。
test是从脚本中读出来的,flyway_schema_history是flyway运行自身所需要的表,用于记录处理过的数据表。查看数据如下:
5.执行第二个SQL
如果这时候你想删掉test表,你删掉表 V20201106001__创建test表.sql 是没用的,因为flyway已经处理过该文件,不会进行处理。解决办法就是加一个文件做一个逆向的操作。如下:
在db/migration目录下新建第二个SQL文件,名称为: V20201106002__删除test表.sql ,内容如下:
drop table test
启动项目让flyway执行脚本。
再次查看数据表test已经删除
查看flyway_schema_history表的数据如下:
补充:flyway 脚本执行失败的话会导致服务启动失败,success 为 0 的时候,修改正确之后不会重新加载脚本,需要删掉flyway记录表的那条数据。
补充:flyway 启动会校验已经执行过的脚本,如果校验失败会导致启动失败,解决方法可以是修改数据表的checksum 值为日志打印的解析出来的新值。
补充: 关于源码
flyway 自动配置在org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration 类。
核心逻辑是在:org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer#afterPropertiesSet 后置处理器然后转交给核心类 org.flywaydb.core.Flyway里面。做操作的入口是org.flywaydb.core.Flyway#migrate -》 org.flywaydb.core.Flyway#execute, 会进行一系列的解析验证、然后执行sql 脚本。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2017-11-06 hash存储结构【六】
2017-11-06 配置iptables,把80端口转到8080