背景
目前我们的项目代码都会交由Git、SVN等版本管理工具进行管理,但是我们的sql脚本,尤其是各类ddl脚本并没有进行版本的管理(python的web框架Django默认就提供了类似的工具,从一开始就鼓励开发者通过版本管理的方式进行数据库的变更)。当我们的项目从一个环境迁移到另一个中时,往往需要手工来完成表的初始化工作,这一环节中由于各种原因可能会出现脚本的遗漏导致上线失败。因此我们需要一个数据库版本管理工具来代替人工操作,完成数据库表的升级变更。
在Springboot这个生态下,主流的是flyway和liquibase,相较于liquibase,flyway的配置会更加简单,这里使用flyway作为数据库管理工具。
最新版本的flyway不再支持mysql 5.7及以下版本,如果需要使用mysql5.7可以考虑商业版本,或者降低flyway的版本并自行完成相关bean的初始化工作,又或者使用别的工具替换
相关配置
添加依赖
首先是添加依赖,我们使用spring-boot-starter-parent作为父级项目,可以在依赖中直接添加flyway-mysql
,这里如果使用别的数据库,可以根据需要替换为相应的依赖
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version><relativePath/> <!-- lookup parent from repository --></parent><dependency><groupId>org.flywaydb</groupId><artifactId>flyway-mysql</artifactId></dependency>
配置文件
flyway默认会使用已经配置好的数据源,如果需要更加精细化的管理,也可以自行指定
配置项 | 参考值 | 备注 |
---|---|---|
spring.flyway.locations | classpath:/db/migration | 脚本存放的路径,resources/db/migration |
spring.flyway.baseline-on-migrate | true | 如果数据库已经有表,需要设为true |
spring.flyway.user | 数据库用户 | |
spring.flyway.password | 数据库密码 | |
spring.flyway.url | JDBC url |
数据脚本管理
交由flyway管理的脚本都需要放在spring.flyway.locations
配置的目录下,并且文件名有一定的格式要求
[V|R]{版本号}__{脚本描述}.sql
V代表一次性执行脚本,R代表可重复执行脚本,一个例子
flyway会在数据库中创建一个名为flyway_schema_history,所有执行过的脚本都会存放在表中。