我们开发的软件有很好的版本控制、明确的部署流程,但是我们的数据库呢?长时间以来,一直依赖于手动执行sql表结构和数据更改,没有自动化的解决方案。
本次要介绍的便是数据库版本控制工具Flayway,记录数据库所有版本演化和状态变更。启动项目便检查当前数据库版本,如若不是最新便进行Migration 操作,保证各位小伙伴开发基于同一数据库版本,也保证了各个环境如dev、sit、uat数据库一致。
Flyway原理
项目集成Flyway启动后,会首先检查数据库中是否存在Flayway核心记录表flyway_schema_history,如若不存在便创建它。紧接着,扫描项目SQL文件,然后据版本号进行排序,并按顺序记录执行SQL。执行相应SQL后,表记录会更新。当Flyway再次扫描SQL文件时,发现不是最新文件,会忽略本条SQL。这样只要每次创建的SQL文件高于上次版本,下一次启动项目的时候,Flayway会自动更新数据库,实现数据库版本管理。
(sql脚本的格式:V+版本号+双下划线+描述)
详细原理介绍请参考Flyway官网:
https://flywaydb.org/getstarted/how
如何使用
创建springboot工程,以mysql数据库为例,使用JPA,引入Flyway依赖。
注意:
1. springboot2.x对flyway版本要求为5.x
2. MySQL 5.1不再被Flayway Community版本支持,但是Flyway Enterprise版本仍然支持
<dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> </dependency> <plugin> <groupId>org.flywaydb</groupId> <artifactId>flyway-maven-plugin</artifactId> </plugin>
注意:在同时使用Flayway和JPA的时候,配置文件中不可再配置ddl-auto: update。配置文件如下:
spring: datasource: driverClassName: com.mysql.jdbc.Driver username: your username password: your password url: jdbc:mysql://localhost:3306/test jpa: database: mysql show-sql: true
在resource目录下创建/db/migration文件夹,放入创建表SQL,注意命名格式:
V1__create_student_tb.sql
use test; CREATE TABLE student_tb ( id int(10) NOT NULL AUTO_INCREMENT, student_name varchar(10) NOT NULL, student_class varchar(50) NOT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
启动springboot工程,flyway会自动执行以上SQL并记录数据库迁移版本。下次有SQL更新时,命名SQL文件名版本大于V1即可。
其他配置
flyway.baseline-on-migrate:假如已经存在数据库表和记录,设置此参数为true,默认为false flyway.baseline-version:执行基准迁移时候版本,默认为1 flyway.enabled:是否开启flyway,默认为true flyway.validate-on-migrate:执行迁移时,是否校验,默认为true flyway.encoding:设置编码,默认为UTF-8
喜欢就点个爱心吧!
本文暂时没有评论,来添加一个吧(●'◡'●)