Spring Boot中使用Flyway来管理数据库版本

  flyway是一个开源的数据库迁移工具。类似于数据库的版本控制工具。flyway的数据库修改文件默认放在resource下的db.migration文件夹中,以V{version_number}__{description}的格式命名。各脚本的执行信息会在数据库的schema_version表中做详细记录。每一次编译或运行时,会自动根据schema_version表中的记录,执行还未记录的脚本,保证数据库更新到最新。使用flyway是一种保证处于持续开发或多人并行开发情况下项目的数据库(包括本地数据库)保持一致的有效方法。那么springboot项目中如何集成flyway呢?

  第一步,在pom.xml中增加flyway的依赖:

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>5.0.3</version>
</dependency>

  第二步,按Flyway的规范创建版本化的SQL脚本。在工程的src/main/resources目录下创建db/migration目录,在db/migration目录下创建版本化的SQL脚本V1__Base_version.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(5) DEFAULT NULL COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

  在这里需要强调的一点是,version_number必须按增序添加。flyway每次执行会检查所有的migration脚本,如果发下有未执行但是version_number早于已执行过的脚本存在,就会抛出异常。

  最后在spring boot的配置文件application.properties中,加入数据库链接基本信息。需要提前创建migration数据库,并给用户root CRUD权限。

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/migration?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

  准备完毕后,去控制台执行mvn clean install -DskipTests,项目会自动重新编译,编译时就会检查migration脚步并执行相应脚本。

2018-03-31 10:18:33,867  INFO DatabaseFactory:44 - Database: jdbc:mysql://127.0.0.1:3306/migration (MySQL 5.7)
2018-03-31 10:18:33,975  INFO DbValidate:44 - Successfully validated 1 migration (execution time 00:00.016s)
2018-03-31 10:18:34,089  INFO JdbcTableSchemaHistory:44 - Creating Schema History table: `migration`.`flyway_schema_history`
2018-03-31 10:18:35,081  INFO DbMigrate:44 - Current version of schema `migration`: << Empty Schema >>
2018-03-31 10:18:35,090  INFO DbMigrate:44 - Migrating schema `migration` to version 1 - demo base

  进入数据库,看是否执行成功。

mysql> use migration;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+-----------------------+
| Tables_in_migration   |
+-----------------------+
| flyway_schema_history |
| user                  |
+-----------------------+
2 rows in set (0.00 sec)

  以后涉及到数据库变动,直接在db.migration中根据命名规则加入相应的SQL或java脚本,在编译时都会自动执行数据库迁移了,是不是很方便啊。

  

posted @ 2018-03-31 10:23  木易森林  阅读(129)  评论(0编辑  收藏