Flyway 助力資料庫腳本自動化管理攻略

来源:https://www.cnblogs.com/lianggzone/archive/2019/10/23/11729679.html
-Advertisement-
Play Games

原文地址: "梁桂釗的博客" 博客地址: "http://blog.720ui.com" 歡迎關註公眾號:「服務端思維」。一群同頻者,一起成長,一起精進,打破認知的局限性。 今天,探討一個有趣的話題:我們可以通過 Git 來實現項目版本控制;通過 Jenkins 進行持續集成,那麼對於資料庫層面,我 ...


原文地址:梁桂釗的博客

博客地址:http://blog.720ui.com

歡迎關註公眾號:「服務端思維」。一群同頻者,一起成長,一起精進,打破認知的局限性。

今天,探討一個有趣的話題:我們可以通過 Git 來實現項目版本控制;通過 Jenkins 進行持續集成,那麼對於資料庫層面,我們仍然依賴於純手工運行 SQL 腳本,對此,我們在多環境(開發環境、測試環境、預發環境、生產環境)中如何確保其 SQL 腳本的最新性和正確性?

image.png
眾所周知,人工的操作非常容易出問題,我們應該讓程式幫忙自動進行管理和遷移。今天,筆者推薦一款開源的資料庫遷移工具 Flyway。

image.png

Flyway 不僅可以支持 MySQL,它也可以支持非常多其他的資料庫。
image.png

事實上,Spring Boot 已經完美整合了 Flyway。對此,我們可以非常便捷地使用它。首先,我們引入 Maven 依賴。(註意的是,我們項目中還需要 spring-boot-starter-jdbc、 mysql-connector-java 依賴)

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

此外,我們在 application.yml 中配置相關選項。Spring Boot 預設在 classpath://db/migration 目錄下掃描Migration。這裡,筆者通過 spring.flyway.locations 將其調整為 db/sql。

spring:
  flyway:
    enabled: true
    baseline-on-migrate: true
    locations: [classpath:db/sql]

當系統程式啟動時,它會自動創建 flyway_schema_history 文件。(當然,也可以自己手動創建)。這張表是 Flyway 的元數據表, 其保存著每次 migration 的記錄, 記錄包含 migration 腳本的版本號和 SQL 腳本的 checksum 值。當一個新的 SQL 腳本被掃描到後, Flyway 解析該 SQL 腳本的版本號, 並和 metadata 表對比, 如果該 SQL 腳本版本更新的話, 將在指定的 DB 上執行該 SQL 文件, 否則跳過該 SQL 文件。

CREATE TABLE `flyway_schema_history` (
  `installed_rank` int(11) NOT NULL,
  `version` varchar(50) DEFAULT NULL,
  `description` varchar(200) NOT NULL,
  `type` varchar(20) NOT NULL,
  `script` varchar(1000) NOT NULL,
  `checksum` int(11) DEFAULT NULL,
  `installed_by` varchar(100) NOT NULL,
  `installed_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `execution_time` int(11) NOT NULL,
  `success` tinyint(1) NOT NULL,
  PRIMARY KEY (`installed_rank`),
  KEY `flyway_schema_history_s_idx` (`success`)
)

然後,我們在 db/sql 下手動創建一個初始化的 SQL 腳本:V1.1__INIT_DB.sql。

DROP TABLE IF EXISTS `tag`;

CREATE TABLE `tag` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `gmtCreate` date DEFAULT NULL,
  `gmtModified` date DEFAULT NULL,
  `title` varchar(32) DEFAULT NULL,
  `parentId` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

那麼,在程式再次啟動後,它會將其自動化發佈到資料庫中。   

image.png

這裡,需要補充的知識點:Flyway 的版本比較規則。其採取左對齊原則,缺位用 0 代替。例如 1.1 比 1.0 版本高,1.1.1 比 1.1  版本高,而 1.1.01 和 1.1.1  版本一致。 並且,它們會按照版本排序且順序執行。

image.png

此外,Flyway 不僅支持 DDL,也同時支持 DML(insert、update、delete)等。因此,我們可以再創建一個 V1.2__INSERT_TAG_DATA.sql 文件來驗證一下。

INSERT tag(title, parentId) values('java', 0);
INSERT tag(title, parentId) values('spring', 0);

最後,我們在來一起探討下Flyway 支持常見類型的 migration:

  • Versioned migrations:資料庫升級腳本
  • Repeatable migrations:可重覆執行,當腳本 checksums 改變時會重新執行。

image.png

  • prefix: 首碼標識,預設值 V 表示 Versioned, R 表示 Repeatable
  • version: 標識版本號, 由一個或多個數字構成, 數字之間的分隔符可用點.或下劃線_
  • separator: 用於分隔版本標識與描述信息, 預設為兩個下劃線__
  • description: 描述信息, 文字之間可以用下劃線或空格分隔
  • suffix: 後續標識, 預設為.sql

總結一下,Flyway 通過元數據(flyway_schema_history)幫忙我們自動化維護和管理資料庫的版本遷移。

寫在末尾

【服務端思維】:我們一起聊聊服務端核心技術,探討一線互聯網的項目架構與實戰經驗。讓所有孤軍奮戰的研發人員都找到屬於自己的圈子,一起交流、探討。在這裡,我們可以認知升級,連接頂級的技術大牛,連接優秀的思維方式,連接解決問題的最短路徑,連接一切優秀的方法,打破認知的局限。

更多精彩文章,盡在「服務端思維」!

本文由博客一文多發平臺 OpenWrite 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Django項目要操作資料庫,首先要和資料庫建立連接,才能讓程式中的數據和資料庫關聯起來進行數據的增刪改查操作 Django項目預設使用mysqldb模塊進行和mysql資料庫之間的交互操作。 下麵看下Django進行資料庫操作的步驟: 1. 修改settings.py 配置數據項 配置項參數用法: ...
  • 本片文章續《Spring Boot 入門(八):集成RabbitMQ消息隊列》,關於Quartz定時任務請參考《Quartz的基本使用之入門(2.3.0版本)》 spring boot實現定時任務,除了集成Quartz外,還可以直接使用scheduler註解。使用1個簡單的註解就可以完成,為什麼還要 ...
  • 數據去重可以使用duplicated()和drop_duplicates()兩個方法。 DataFrame.duplicated(subset = None,keep =‘first’)返回boolean Series表示重覆行 參數: subset:列標簽或標簽序列,可選 僅考慮用於標識重覆項的某 ...
  • 使用redis的list列表來實現消息隊列功能,相信大家都聽過消息隊列,但是在業務中可能並沒有真正去使用它。在公司項目中正好有個場景使用到了消息隊列,因此就來說一下流程。在web界面上有個功能是群發郵件,用戶可以創建一個5000郵箱的郵件列表,編輯完郵件內容後可以給這個郵件列表發信。如果使用同步的方 ...
  • 本片文章是基於前一篇寫的,《Spring Boot 入門(六):集成 treetable 和 zTree 實現樹形圖》,本篇主要介紹了spring boot集成swagger2。關於swagger的介紹,自行谷歌。我這裡有在網上購買的相關視頻資料,有需要可以呼叫我。 1.引入相關依賴 很多地方只引入 ...
  • 恢復內容開始 恢復內容結束 ...
  • 深入理解Java記憶體模型 【1】CPU和緩存的一致性 ​ 我們應該都知道,電腦在執行程式的時候,每條指令都是在CPU中執行的,而執行的時候,又免不了要和數據打交道。而電腦上面的數據,是存放在主存當中的,也就是電腦的物理記憶體啦。 ​ 剛開始,還相安無事的,但是隨著CPU技術的發展,CPU的執行速 ...
  • 模塊在python編程中的地位舉足輕重,熟練運用模塊可以大大減少代碼量,以最少的代碼實現複雜的功能。 下麵介紹一下在python編程中如何導入模塊: (1)import 模塊名:直接導入,這裡導入模塊中的所有與函數; 這裡的模塊也可以是自己編寫的腳本名稱,如: (2) from 模塊名 import ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...