數據庫遷移工具flyway的使用與詳解


1.簡介

Flyway 是一個開源的數據庫遷移工具。它強烈支持簡單性和約定而不是配置。它僅基於 7 個基本命令: Migrate、 Clean、 Info、 Validate、 Undo、 Baseline和 Repair。

遷移可以用SQL (支持特定於數據庫的語法(例如 PL/SQL、T-SQL 等))或Java (用於高級數據轉換或處理 LOB)編寫。

它有一個命令行客戶端。如果您使用的是 JVM,我們建議您使用Java API 在應用程序啟動時遷移數據庫。或者,您也可以使用Maven 插件 或Gradle 插件。

如果這還不夠,還有 適用於 Spring Boot、Dropwizard、Grails、Play、SBT、Ant、Griffon、Grunt、Ninja 等的插件!

Flyway的GitHub地址如下:

https://github.com/flyway/flyway

2.數據遷移

Flyway 對數據庫的所有更改都稱為遷移。遷移可以是版本化的或 可重復的。版本化遷移有兩種形式:常規和撤消。

版本化遷移有一個版本、一個描述和一個校驗和。版本必須是唯一的。該描述純粹是提供信息,讓您能夠記住每次遷移的作用。校驗和用於檢測意外更改。版本化遷移是最常見的遷移類型。它們只按順序應用一次。

可選地,可以通過提供具有相同版本的撤消遷移來撤消它們的影響。可重復的遷移有描述和校驗和,但沒有版本。不是只運行一次,而是在每次校驗和更改時(重新)應用它們。

在單個遷移運行中,可重復的遷移總是最后應用,在所有掛起的版本化遷移都已執行之后。可重復遷移按其描述的順序應用。默認情況下,版本化和可重復遷移都可以用SQL 或Java編寫,並且可以由多個語句組成。

Flyway 自動發現文件系統和 Java類路徑上的遷移。為了跟蹤哪些遷移已在何時以及由誰應用,Flyway 向您的架構添加了一個架構歷史記錄表。

3.使用示例

項目結構:

├─.idea
│  └─libraries
├─.mvn
│  └─wrapper
├─src
│  ├─main
│  │  ├─java
│  │  │  └─com
│  │  │      └─flywaydemo
│  │  └─resources
│  │      └─db
│  │          └─migration
│  └─test
│      └─java
│          └─com
│              └─flywaydemo
└─target
    ├─classes
    │  ├─com
    │  │  └─flywaydemo
    │  └─db
    │      └─migration
    ├─generated-sources
    │  └─annotations
    ├─generated-test-sources
    │  └─test-annotations
    └─test-classes
        └─com
            └─flywaydemo

maven依賴:

<dependencies>
    <!--引入flyway-->
    <dependency>
        <groupId>org.flywaydb</groupI
        <artifactId>flyway-core</arti
        <!--可根據GitHub最新版本編寫-->
        <version>6.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.
        <artifactId>spring-boot-start
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-j
    </dependency>
    <dependency>
        <groupId>org.springframework.
        <artifactId>spring-boot-start
    </dependency>
    <dependency>
        <groupId>org.springframework.
        <artifactId>spring-boot-start
        <scope>test</scope>
    </dependency>
</dependencies>

在resources文件夾下創建db/migration目錄,在此目錄中創建sql腳本,格式為:版本號+分隔符+描述,如V1.0__v1__Init_Table.sql。示例sql如下:

CREATE TABLE `t_user` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '賬號id',
  `name` varchar(63) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `password` varchar(200) COLLATE utf8mb4_general_ci NOT NULL COMMENT '賬號密碼',
  `phone` varchar(16) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '手機號',
  `email` varchar(30) COLLATE utf8mb4_general_ci DEFAULT '' COMMENT '郵箱',
  `enable` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否啟用',
  `createTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  `updateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

application.yml文件:

spring:
  # 數據庫連接配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT&allowPublicKeyRetrieval=true
    username: root
    password: root
  flyway:
    # 是否啟用flyway
    enabled: true
    # 編碼格式,默認UTF-8
    encoding: UTF-8
    # 遷移sql腳本文件存放路徑,默認db/migration
    locations: classpath:db/migration
    # 遷移sql腳本文件名稱的前綴,默認V
    sql-migration-prefix: V
    # 遷移sql腳本文件名稱的分隔符,默認2個下划線__
    sql-migration-separator: __
    # 遷移sql腳本文件名稱的后綴
    sql-migration-suffixes: .sql
    # 遷移時是否進行校驗,默認true
    validate-on-migrate: true
    # 當遷移發現數據庫非空且存在沒有元數據的表時,自動執行基准遷移,新建schema_version表
    baseline-on-migrate: true

然后啟動項目,控制台正常輸出后后查看數據。

在數據庫中查看相關的數據變更,可以看到flyway_schema_history表插入了sql的執行記錄。

查看插入的數據表如下所示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM