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/
目录下创建版本化的SQL脚本migration
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脚本,在编译时都会自动执行数据库迁移了,是不是很方便啊。