Spring Boot中使用Flyway來管理數據庫版本
flyway是一個開源的數據庫遷移工具。類似於數據庫的版本控制工具。flyway的數據庫修改文件默認放在resource下的db.migration文件夾中,以V{version_number}__{description}的格式命名。各腳本的執行信息會在數據庫的schema_version表中做詳細記錄。每一次編譯或運行時,會自動根據schema_version表中的記錄,執行還未記錄的腳本,保證數據庫更新到最新。使用flyway是一種保證處於持續開發或多人並行開發情況下項目的數據庫(包括本地數據庫)保持一致的有效方法。那麽springboot項目中如何集成flyway呢?
第一步,在pom.xml
<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腳本,在編譯時都會自動執行數據庫遷移了,是不是很方便啊。
Spring Boot中使用Flyway來管理數據庫版本