自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

運(yùn)維 數(shù)據(jù)庫運(yùn)維
Flyway是一款數(shù)據(jù)庫版本控制管理工具,支持?jǐn)?shù)據(jù)庫版本自動(dòng)升級(jí)。項(xiàng)目初始化的時(shí)候,往往都是要先手動(dòng)執(zhí)行數(shù)據(jù)庫腳本。
本文轉(zhuǎn)載自微信公眾號(hào)「Java大廠面試官」,作者laker 。轉(zhuǎn)載本文請(qǐng)聯(lián)系Java大廠面試官公眾號(hào)。  
  • Flyway是什么
  • Flyway集成和使用
    • 添加依賴
    • 配置文件
    • 腳本
    • 測試
  • 原理
  • 高級(jí)
    • 基于Java的遷移回調(diào)

Flyway是什么

Flyway是一款數(shù)據(jù)庫版本控制管理工具,支持?jǐn)?shù)據(jù)庫版本自動(dòng)升級(jí)。

  • 項(xiàng)目初始化的時(shí)候,往往都是要先手動(dòng)執(zhí)行數(shù)據(jù)庫腳本。
  • 在開發(fā)過程當(dāng)中,數(shù)據(jù)結(jié)構(gòu)或者數(shù)據(jù)有更新時(shí),往往都要手動(dòng)執(zhí)行腳本同步開發(fā)環(huán)境、測試環(huán)境。

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

Flyway集成和使用

添加依賴

  1. <dependency> 
  2.   <groupId>org.flywaydb</groupId>  
  3.   <artifactId>flyway-core</artifactId> 
  4. </dependency> 

 

由于是Spring Boot項(xiàng)目集成,版本直接使用默認(rèn)的即可

配置文件

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

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

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

腳本

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

sql腳本的格式:

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

測試

默認(rèn)情況下,Spring Boot在應(yīng)用程序啟動(dòng)時(shí)自動(dòng)運(yùn)行Flyway數(shù)據(jù)庫遷移。

結(jié)果如下:

注意:

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

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

原理

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

兩個(gè) flyway 版本號(hào)的比較, 采用左對(duì)齊原則, 缺位用 0 代替. 舉例如下:

  • 1.2.9.4 比 1.2.9 版本高.
  • 1.2.10 比 1.2.9.4 版本高.
  • 1.2.10 和 1.2.010 版本號(hào)一樣高, 每個(gè)版本號(hào)部分的前導(dǎo) 0 會(huì)被忽略.

Flyway SQL 文件可以分為兩類:

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

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

img

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

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

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

  1. CREATE TABLE  flyway_schema_history 
  2.     ( 
  3.         installed_rank INT NOT NULL
  4.         version VARCHAR(50), 
  5.         description VARCHAR(200) NOT NULL
  6.         type VARCHAR(20) NOT NULL
  7.         script VARCHAR(1000) NOT NULL
  8.         checksum INT
  9.         installed_by VARCHAR(100) NOT NULL
  10.         installed_on TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  11.         execution_time INT NOT NULL
  12.         success TINYINT(1) NOT NULL
  13.         PRIMARY KEY (installed_rank), 
  14.         INDEX flyway_schema_history_s_idx (success) 
  15.     ) 
  16.     ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

高級(jí)

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

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

核心代碼如下:

  1. import lombok.extern.slf4j.Slf4j; 
  2. import org.flywaydb.core.api.callback.BaseCallback; 
  3. import org.flywaydb.core.api.callback.Context; 
  4. import org.flywaydb.core.api.callback.Event; 
  5. import org.flywaydb.core.internal.jdbc.JdbcTemplate; 
  6. import org.springframework.context.annotation.Configuration; 
  7.  
  8. import java.sql.SQLException; 
  9.  
  10. @Configuration 
  11. @Slf4j 
  12. public class ExampleFlywayCallback extends BaseCallback { 
  13.     @Override 
  14.     public void handle(Event event, Context context) { 
  15.         switch (event) { 
  16.             // 在每次成功遷移后觸發(fā)。此事件將在與遷移相同的事務(wù)中觸發(fā) 
  17.             case AFTER_EACH_MIGRATE: 
  18.                 log.info("{},", event); 
  19.                 final JdbcTemplate jdbcTemplate = new JdbcTemplate( 
  20.                         context.getConnection()); 
  21.  
  22.                 // Create 10 random users 
  23.                 for (int i = 1; i <= 10; i++) { 
  24.                     try { 
  25.                         jdbcTemplate.execute(String.format("insert into test_user" 
  26.                                 + " (username, first_name, last_name) values" 
  27.                                 + " ('%d@reflectoring.io', 'Elvis_%d', 'Presley_%d')", i, i, i)); 
  28.                     } catch (SQLException throwables) { 
  29.                         throwables.printStackTrace(); 
  30.                     } 
  31.                 } 
  32.         } 
  33.     } 

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

參考:

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

 

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

 

責(zé)任編輯:武曉燕 來源: Java大廠面試官
相關(guān)推薦

2021-09-01 10:07:43

開發(fā)零搭建Groovy

2021-04-28 16:10:48

開發(fā)腳手架 Spring

2020-08-19 08:55:47

Redis緩存數(shù)據(jù)庫

2021-07-13 18:42:38

Spring Boot腳手架開發(fā)

2021-04-13 14:47:53

認(rèn)證授權(quán)Java

2021-05-13 17:02:38

MDC腳手架日志

2017-12-27 15:16:35

Spring BootFlyway數(shù)據(jù)庫

2021-03-11 14:16:47

Spring Boo開發(fā)腳手架

2021-07-29 18:49:49

Spring開發(fā)腳手架

2021-04-20 19:24:16

腳手架 Java微信

2021-06-29 17:19:44

Spring Boot集成Flyway

2021-06-02 17:58:49

腳手架 冪等性前端

2021-02-19 22:43:50

開發(fā)腳手架Controller

2019-10-30 11:28:56

Javaflyway數(shù)據(jù)庫

2020-06-29 11:35:02

Spring BootJava腳手架

2009-09-16 15:05:58

CakePHP腳手架

2016-08-10 14:59:41

前端Javascript工具

2025-01-26 00:00:35

2022-04-24 11:33:47

代碼管理工程

2023-11-21 17:36:04

OpenFeignSentinel
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)