數據庫版本控制之flyway


一、Flyway

1.1 介紹

Flyway 是用來進行數據庫的版本控制,幫助用戶完成數據庫遷移的工作。使用 Flyway ,用戶可以從任意一個數據庫版本遷移到最新版本,簡單而且有效。

1.3 使用場景

  • 適合團隊共同維護數據庫結構,而不是將數據庫版本維護工作統一交給一個人處理。
  • 方便為不同的環境,維護數據庫版本

1.4 工作原理

1)  在數據庫中維護一張名為 flyway_schema_history 的元數據表,里面存儲着已執行的各個版本的記錄;
2)  掃描系統文件或者應用的類路徑中特定的文件,它們可以由 SQL 或 Java 編寫。
3)  基於文件的版本號進行排序
4)  與元數據表進行校驗,如果版本號低於或等於當前標記的版本,它們將被忽略,高於標記的文件將會被執行並更新元數據表

1.5 運行方式

  • 基於命令行模式,用戶從官網下載工具包,進行一些必要的配置,就可以通過命令行使用其功能。
  • 基於Java API,用戶可以將 Flyway 提供的第三方包加入 classpath,通過 Flyway 提供的 API 來使用其功能。
  • 基於 Maven 或 Gradle,用戶可以通過配置插件,運行 mvn 或 gradle 命令來使用其功能。

1.6 腳本文件命名規則

V<VERSION>__<NAME>.sql
  • 大寫字母 V 開頭
  • 版本號,小版本號可以用下划線隔開,如 2_1
  • 腳本名稱,腳本名稱和版本號之間以兩個下划線隔開
  • 文件后綴為 .sql

二、 基於 SpringBoot 下使用 flyway

2.1 引入 pom 依賴

<dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>6.5.7</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

2.2 創建腳本文件

flyway 默認存放路徑是 src/main/resources/db/migration 這里我們采用自定義的目錄

src/main/resources/db/dev/v1

在目錄中新建 V1_1__createTable.sql 文件,內容如下:

CREATE TABLE `sys_user` (
  `user_id` bigint(21) NOT NULL COMMENT '用戶編碼',
  `user_name` varchar(50) DEFAULT NULL COMMENT '用戶名',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

2.3 配置應用屬性

application.yml 文件中填寫上數據庫和 flyway 相關配置:

spring:
  # flyway 相關配置
  flyway:
    # 啟用 flyway
    enabled: true
    # 字符集編碼
    encoding: utf-8
    # 腳本文件存放地址,默認存放地址為 classpath:db/migration
    locations: classpath:db/dev
  # 數據庫相關配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/flyway_test?serverTimezone=UTC&useUnicode=true&useSSL=false&useUnicode=true&characterEncoding=utf8
    username: root
    password: sa000

2.4 啟動應用

查看數據庫,發現新增了如下兩張表:

查看 flyway_schema_history 表:

可以看到執行的版本記錄

三、 flyway 遇到的問題

3.1 在非空數據庫下執行

默認情況下在非空數據庫下執行,會拋出異常:

Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema(s) `test` but no schema history table. Use baseline() or set baselineOnMigrate to true to initialize the schema history table.

配置屬性baseline-on-migrate 為 true 即可:

spring:
  flyway:
    # 在沒有元數據表的情況下,針對非空Schema執行遷移時是否自動調用基線。 (默認值:false)
    baseline-on-migrate: true
    # 配合 baseline-on-migrate 使用,否則 V1 的版本不會執行
    baseline-version=0:


免責聲明!

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



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