<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          從零搭建開發(fā)腳手架 Spring Boot集成Flyway實現(xiàn)數(shù)據(jù)庫版本管理

          共 7087字,需瀏覽 15分鐘

           ·

          2021-03-27 03:21


          • Flyway是什么

          • Flyway集成和使用

            • 添加依賴

            • 配置文件

            • 腳本

            • 測試

          • 原理

          • 高級

            • 基于Java的遷移回調(diào)

          Flyway是什么

          Flyway是一款數(shù)據(jù)庫版本控制管理工具支持數(shù)據(jù)庫版本自動升級

          • 項目初始化的時候,往往都是要先手動執(zhí)行數(shù)據(jù)庫腳本。

          • 在開發(fā)過程當中,數(shù)據(jù)結(jié)構或者數(shù)據(jù)有更新時,往往都要手動執(zhí)行腳本同步開發(fā)環(huán)境、測試環(huán)境。

          現(xiàn)在我們就可以使用flyway來幫我們自動的去完成這個工作。

          Flyway集成和使用

          添加依賴

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

          由于是Spring Boot項目集成,版本直接使用默認的即可

          配置文件

          spring:
            flyway:
              #是否開啟flyway,默認true
              enabled: true
              #當遷移時發(fā)現(xiàn)目標schema非空,而且沒有元數(shù)據(jù)的表時,(即迭代中項目)是否自動執(zhí)行基準遷移,默認false.
              baseline-on-migrate: true
              # 是否允許無序運行遷移, 默認false,建議開發(fā)環(huán)境開啟,生成環(huán)境關閉
              out-of-order: true
              #設定SQL腳本的目錄,可以配置多個,比如為classpath:db/migration,filesystem:/sql-migrations,默認classpath:db/migration
              locations:
                - classpath:db/migration

          更多參數(shù)見 https://flywaydb.org/documentation/configfiles

          這些參數(shù)配到springboot2 項目中, 需要加上 spring前綴

          腳本

          resource目錄下面建立db.migration目錄,放置sql文件

          sql腳本的格式

          • V/R+版本號+雙下劃線+描述+結(jié)束符:
            • 例如:V20190429.1530__t_user_update.sql (開發(fā)環(huán)境:建議日期+時分秒)
            • 例如:V1.1__init.sql(生產(chǎn)環(huán)境:建議把上面的腳步合并用版本號)

          測試

          默認情況下,Spring Boot在應用程序啟動時自動運行Flyway數(shù)據(jù)庫遷移

          結(jié)果如下:

          注意:

          Flyway社區(qū)版不支持MySQL5.7以下的版本了

          https://flywaydb.org/documentation/database/mysql

          原理

          Flyway 需要在 DB 中先創(chuàng)建一個 metdata 表 (缺省表名為 flyway_schema_history), 在該表中保存著每次遷移的記錄, 記錄包含遷移腳本的版本號和 SQL 腳本的 checksum 值. 當一個新的 SQL 腳本被掃描到后, Flyway 解析該 SQL 腳本的版本號, 并和 metadata 表已執(zhí)行的遷移對比, 如果該 SQL 腳本版本更新的話, 將在指定的 DB 上執(zhí)行該 SQL 文件, 否則跳過該 SQL 文件.

          兩個 flyway 版本號的比較, 采用左對齊原則, 缺位用 0 代替. 舉例如下:

          • 1.2.9.4 比 1.2.9 版本高.
          • 1.2.10 比 1.2.9.4 版本高.
          • 1.2.10 和 1.2.010 版本號一樣高, 每個版本號部分的前導 0 會被忽略.

          Flyway SQL 文件可以分為兩類:

          • Versioned :用于版本升級, 每個版本有唯一的版本號并只能 apply 一次
          • Repeatable :指可重復加載的 migration, 一旦 SQL 腳本的 checksum 有變動, flyway 就會重新應用該腳本. 它并不用于版本更新, 這類的 migration 總是在 versioned migration 執(zhí)行之后才被執(zhí)行

          默認情況下, Migration SQL的命名規(guī)則如下圖:

          img

          其中的文件名由以下部分組成,除了使用默認配置外,某些部分還可自定義規(guī)則.

          • prefix: 可配置,前綴標識,默認值 V 表示 Versioned, R 表示 Repeatable
          • version: 標識版本號, 由一個或多個數(shù)字構成, 數(shù)字之間的分隔符可用點.或下劃線_
          • separator: 可配置, 用于分隔版本標識與描述信息, 默認為兩個下劃線__
          • description: 描述信息, 文字之間可以用下劃線或空格分隔
          • suffix: 可配置, 后續(xù)標識, 默認為.sql*

          Flyway 的 metadata 表結(jié)果如下:

          CREATE TABLE  flyway_schema_history
              (
                  installed_rank INT NOT NULL,
                  version VARCHAR(50),
                  description VARCHAR(200NOT NULL,
                  type VARCHAR(20NOT NULL,
                  script VARCHAR(1000NOT NULL,
                  checksum INT,
                  installed_by VARCHAR(100NOT NULL,
                  installed_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                  execution_time INT NOT NULL,
                  success TINYINT(1NOT NULL,
                  PRIMARY KEY (installed_rank),
                  INDEX flyway_schema_history_s_idx (success)
              )
              ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

          高級

          基于Java的遷移回調(diào)

          Flyway使我們能夠使用兩種不同的方法(Java或SQL)創(chuàng)建回調(diào)。前者是最靈活的一種。它為我們提供了執(zhí)行任意代碼的自由。

          核心代碼如下

          import lombok.extern.slf4j.Slf4j;
          import org.flywaydb.core.api.callback.BaseCallback;
          import org.flywaydb.core.api.callback.Context;
          import org.flywaydb.core.api.callback.Event;
          import org.flywaydb.core.internal.jdbc.JdbcTemplate;
          import org.springframework.context.annotation.Configuration;

          import java.sql.SQLException;

          @Configuration
          @Slf4j
          public class ExampleFlywayCallback extends BaseCallback {
              @Override
              public void handle(Event event, Context context) {
                  switch (event) {
                      // 在每次成功遷移后觸發(fā)。此事件將在與遷移相同的事務中觸發(fā)
                      case AFTER_EACH_MIGRATE:
                          log.info("{},", event);
                          final JdbcTemplate jdbcTemplate = new JdbcTemplate(
                                  context.getConnection());

                          // Create 10 random users
                          for (int i = 1; i <= 10; i++) {
                              try {
                                  jdbcTemplate.execute(String.format("insert into test_user"
                                          + " (username, first_name, last_name) values"
                                          + " ('%[email protected]', 'Elvis_%d', 'Presley_%d')", i, i, i));
                              } catch (SQLException throwables) {
                                  throwables.printStackTrace();
                              }
                          }
                  }
              }
          }

          我們可以在Java遷移回調(diào)中執(zhí)行所需的任何邏輯,可以靈活地實現(xiàn)更多變態(tài)需求。

          參考:

          • https://www.cnblogs.com/harrychinese/p/springboot_flyway.html

          • https://blog.csdn.net/qq_38455201/article/details/103493041

          我已經(jīng)更新了《10萬字Springboot經(jīng)典學習筆記》,點擊下面小卡片,進入【Java開發(fā)寶典】,回復:筆記,即可免費獲取。

          點贊是最大的支持 

          瀏覽 74
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线黄网站 | 男人的天堂视频网站 | 金先生大韩航空模特 | 日本道大香蕉伊人在线 | 性生活片无码在线 |