基于Flyway實現簡化Spring Boot項目部署

 更新時間:2020-06-14 04:45:27   作者:佚名   我要評論(0)

1.什么是 Flyway
我們在公司做開發時,由于項目需求的變化,或者前期設計缺陷,導致在后期需要修改數據庫,這應該是一個比較常見的事情,如果項目還沒上線,你可能把

1.什么是 Flyway

我們在公司做開發時,由于項目需求的變化,或者前期設計缺陷,導致在后期需要修改數據庫,這應該是一個比較常見的事情,如果項目還沒上線,你可能把表刪除了重新創建,但是如果項目已經上線了,就不能這樣簡單粗暴了,我們需要通過 SQL 腳本在已有數據表的基礎上進行升級。

目前 Java 這塊,想要對數據庫的版本進行管理主要有兩個工具:

Flyway

Liquibase

兩個工具各有千秋,但是核心功能都是數據庫的版本管理,這里主要來看 Flyway。就像我們使用 Git 來管理代碼版本一樣,Flyway 可以用來管理數據庫版本。

好了,接下來我們就來看看用 Flyway 如何簡化微人事部署,然后再來說說 Flyway 的一個大致原理。

2.嵌入到微人事

如果是在一個全新的項目中使用 Flyway,那么在新建一個 Spring Boot 項目時,就有 Flyway 的選項,如下圖:


項目創建成功后,resources 目錄下也會多出來一個 db/migration 目錄,這個目錄用來存放數據庫腳本,如下:

注意

這個如果創建項目時就選擇了 Flyway 依賴,就會有這個目錄。現在我要在已經做好的微人事中加入 Flyway,這個目錄就需要我手動創建了。

首先在微人事中添加 flyway 依賴:

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

然后在 vhr-web 模塊下的 resources 目錄下,手動創建 db/migration 目錄,然后在該目錄下創建數據庫腳本,數據庫腳本的命名方式如下:

V<VERSION>__<NAME>.sql

首先是大寫字母 V,然后是版本號,要是有小版本可以用下劃線隔開,例如 2_1,版本號后面是兩個下劃線,然后是腳本名稱,文件后綴是 .sql。

例如我這里創建我的第一個數據庫腳本,取名為 V1__vhr.sql,腳本內容就是微人事的數據庫腳本,大家可以在 https://github.com/lenve/vhr 這里獲取到。

完了之后,可以不用添加額外配置,大家只需要在本地 MySQL 中創建一個空的 vhr 數據庫即可,然后直接啟動微人事項目,項目啟動成功后,我們查看啟動日志:

從這段啟動日志中,我們可以看到 Flyway 的執行信息,數據庫腳本的執行執行,同時這里還說了,Flyway 還給創建了一個 flyway_schema_history 表,這個表用來記錄數據庫的更新歷史。

這個時候,打開本地數據庫,我們發現 vhr 庫中該有的表都有了。同時還發現了 flyway_schema_history 表,如下:

有了這條記錄,下次再啟動 vhr 項目,V1__vhr.sql 這個腳本文件就不會執行了,因為系統知道這個腳本已經執行過了,如果你還想讓 V1__vhr.sql 腳本再執行一遍,需要手動刪除 flyway_schema_history 表中的對應記錄,那么項目啟動時,這個腳本就會被執行了。

3.執行細節

  • 我們在定義腳本的時候,除了 V 字開頭的腳本之外,還有一種 R 字開頭的腳本,V 字開頭的腳本只會執行一次,而 R 字開頭的腳本,只要腳本內容發生了變化,啟動時候就會執行。
  • 使用了 Flyway 之后,如果再想進行數據庫版本升級,就不用該以前的數據庫腳本了,直接創建新的數據庫腳本,項目在啟動時檢測了有新的更高版本的腳本,就會自動執行,這樣,在和其他同事配合工作時,也會方便很多。因為正常我們都是從 Git 上拉代碼下來,不拉數據庫腳本,這樣要是有人更新了數據庫,其他同事不一定能夠收到最新的通知,使用了 Flyway 就可以有效避免這個問題了。
  • 所有的腳本,一旦執行了,就會在 flyway_schema_history 表中有記錄,如果你不小心搞錯了,可以手動從 flyway_schema_history 表中刪除記錄,然后修改 SQL 腳本后再重新啟動(生產環境不建議)。

4.其他配置

在 Spring Boot 中,關于 Flyway 也有不少配置,這些配置都在 application.properties 中進行配置,常用的幾個來和大家說下:

  • spring.flyway.enabled:是否開啟 flyway,默認就是開啟的
  • spring.flyway.encoding:flyway 字符編碼
  • spring.flyway.locations:sql 腳本的目錄,默認是 classpath:db/migration,如果有多個,用 , 隔開
  • spring.flyway.clean-disabled:這個屬性非常關鍵,它表示是否要清除已有庫下的表,如果執行的腳本是 V1__xxx.sql,那么會先清除已有庫下的表,然后再執行腳本,這在開發環境下還挺方便,但是在生產環境下就要命了,而且它默認就是要清除,生產環境一定要自己配置設置為 true。
  • spring.flyway.table:配置數據庫信息表的名稱,默認是 flyway_schema_history。

好了,關于 Flyway 我就先說這么多,代碼也已經更新到 vhr (https://github.com/lenve/vhr)上了,感興趣的小伙伴不妨下載試一下。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

  • SpringBoot整合Flyway的方法(數據庫版本遷移工具)
  • 淺談SpringBoot之開啟數據庫遷移的FlyWay使用
  • 詳解Spring Boot中使用Flyway來管理數據庫版本
  • Spring boot如何快速的配置多個Redis數據源
  • SpringBoot獲取配置文件的簡單實現方法
  • Spring Boot加密配置文件特殊內容的示例代碼詳解
  • 詳解關于SpringBoot的外部化配置使用記錄
  • 關于springboot 配置文件中屬性變量引用方式@@解析

相關文章

  • 基于Flyway實現簡化Spring Boot項目部署

    基于Flyway實現簡化Spring Boot項目部署

    1.什么是 Flyway 我們在公司做開發時,由于項目需求的變化,或者前期設計缺陷,導致在后期需要修改數據庫,這應該是一個比較常見的事情,如果項目還沒上線,你可能把
    2020-06-14
  • Java Reactor反應器模式使用方法詳解

    Java Reactor反應器模式使用方法詳解

    Reactor反應器模式 到目前為止,高性能網絡編程都繞不開反應器模式。很多著名的服務器軟件或者中間件都是基于反應器模式實現的,如Nginx、Redis、Netty。 反應器
    2020-06-14
  • Java類加載機制實現流程及原理詳解

    Java類加載機制實現流程及原理詳解

    前言   我們知道,Java項目編譯后會生成許許多多的class文件,class文件保存著類的描述信息。虛擬機把描述類的數據從Class文件加載到內存,并對數據進行校驗、轉化
    2020-06-14
  • Python celery原理及運行流程解析

    Python celery原理及運行流程解析

    celery簡介 celery是一個基于分布式消息傳輸的異步任務隊列,它專注于實時處理,同時也支持任務調度。它的執行單元為任務(task),利用多線程,如Eventlet,gevent
    2020-06-14
  • Django QuerySet查詢集原理及代碼實例

    Django QuerySet查詢集原理及代碼實例

    一 概念 Django的ORM中存在查詢集的概念。 查詢集,也稱查詢結果集、QuerySet,表示從數據庫中獲取的對象集合。 當調用如下過濾器方法時,Django會返回查詢集(而
    2020-06-14
  • Python Django中間件使用原理及流程分析

    Python Django中間件使用原理及流程分析

    一、什么是Django中間件   Django 中間件是用來處理Django的請求request和響應response的框架級別的鉤子,它是一個輕量,低級別的插件系統,用于全局范圍內改變
    2020-06-14
  • Pandas缺失值2種處理方式代碼實例

    Pandas缺失值2種處理方式代碼實例

    處理方式: 存在缺失值nan,并且是np.nan: 刪除存在缺失值的:dropna(axis='rows') 替換缺失值:fillna(df[].mean(), inplace=True) 不是缺失值nan,有默認標
    2020-06-14
  • php獲取小程序碼的實現代碼(B類接口)

    php獲取小程序碼的實現代碼(B類接口)

    效果圖 生成小程序碼的php代碼 public function qrcode(){ $member_id = session('id'); if(empty($member_id)) $this->error('請先登錄'); //推廣
    2020-06-14
  • PyInstaller運行原理及常用操作詳解

    PyInstaller運行原理及常用操作詳解

    pyinstaller 屬于Python第三方庫,使用前需先安裝 # 首先安裝pyinstaller pip install pyinstaller PyInstaller生成可執行程序 # PyInstaller 工具的命
    2020-06-14
  • Python輕量級web框架bottle使用方法解析

    Python輕量級web框架bottle使用方法解析

    Bottle是一個輕量級的Web框架,此框架只由一個 bottle.py 文件構成,不依賴任何第三方模塊。 #!/usr/bin/env python # -*- coding:utf-8 -*- from bottle import
    2020-06-14

最新評論

买宝宝用品赚钱吗 安徽11选5前三遗漏数据 今天快乐双彩 12bet在线娱乐百家乐 多乐彩开奖 广东十一选五中奖王 重庆幸运农场下载西西软件 指数期货和指数的关系 海外资产配置 期货股票融资 青海11选5一定牛 新疆十一选五走势图 广东11选五5预测 陕西体彩十一选五玩法 河北快3豹子遗漏查询 淘股吧手机版 云南快乐10分基本走势图工具图表