SpringBoot 應用 flyway

前言

商務網站開發入門這門選修課已經結課了,學生的做業也提交了有一段時間了,出分迫在眉睫,此次評閱採用了多人閱卷的方式,相較於做業系統以前由一我的批閱做業的方式,公平了很多,做業狀態由原來的已評閱和未評閱改成未評閱、評閱中、已評閱,表示評閱的字段由reviewed改成status,因爲要在數據表層面直接操做,所以要用到SQL語句,當時第一想法是在實體類里加status字段,而後在倉庫層手寫SQl,判斷reviewed屬性爲1(評閱完成)的,status賦值爲2(已評閱),其餘的均爲0,直到老師提到flyway,我才知道還有這麼神奇的工具。git

flyway

說來也巧,在老師提到flyway二十分鐘以前,我看到了黃庭祥學長寫的關於flyway的博客:flyway數據庫管理,也許這就是緣分吧,當時好像要查一些關於SQL的東西,依稀記得學長寫過,雖然說到最後沒找到,可是卻陰差陽錯發現了這個,雖然說沒咋看明白,可是感受也挺好。
image.png
進入flyway官網,首先展現的是一段話:github

數據庫的版本控制。
跨全部環境的健壯的模式演化。
輕鬆,愉快和樸素的SQL。

對於flyway,有的博客是這樣介紹的:spring

Flyway 是一款開源的數據庫版本管理工具,它更傾向於規約優於配置的方式。Flyway 能夠獨立於應用實現管理並跟蹤數據庫變動,支持數據庫版本自動升級,而且有一套默認的規約,不須要複雜的配置,Migrations 能夠寫成 SQL 腳本,也能夠寫在 Java 代碼中,不只支持 Command Line 和 Java API,還支持 Build 構建工具和 Spring Boot 等,同時在分佈式環境下可以安全可靠地升級數據庫,同時也支持失敗恢復等。

第一次成功運行會生成一個名爲"flyway_schema_history"的數據表,以後進行管理都是基於該表
其工做原理以下:
image.png數據庫

配置應用flyway

首先在pom.xml文件中引入依賴:segmentfault

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

這部分是沒有寫全的,由於不一樣的Spring版本引入的依賴是不同的,以前也沒了解過,真的不知道每一個Spring版本都對應一個穩定的依賴包,後來看了喜碩學長關於flyway的博客:flyway 實踐,才知道居然有這種事,對於這種現象,學長是這樣解釋的:安全

spring-boot項目依賴於 spring-boot-dependencies項目,該項目中管理了全部被 spring-boot整合過的技術的版本號。
去文件內搜索 flyway,即找到相關的配置 <flyway.version>5.0.7</flyway.version>
spring-boot規定好了,若是你用的是 spring-boot 2.0.5.RELEASE版本,那建議使用 flyway:5.0.7

clipboard.png
這樣管理一是方便,還有一個緣由我以爲是避免衝突。
當引入多個包的時候,就可能會出現版本衝突,我相信,spring-boot確定是將這些版本通過測試的,保證了無衝突纔會推薦使用這些版本的。app

而後我找到了依賴文件,找到flyway對應的版本:
image.png
而後添加到依賴中便可:分佈式

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

而後配置application.yaml的flyway字段:spring-boot

flyway:
    enabled: true
    baseline-on-migrate: true
    baseline-version: 1
    check-location: true
enabled表示是否開啓flywary
 
baseline-on-migrate表示當遷移時發現目標schema非空,並且帶有沒有元數據的表時,是否自動執行基準遷移,默認false.

baseline-version表示開始執行基準遷移時對現有的schema的版本打標籤,默認值爲1.

check-location表示檢查遷移腳本的位置是否存在,默認false.

接下來,就是引入SQL文件,在resources文件下新建db文件,在db文件中新建migration(遷移)文件,這是flyway默認的檢索路徑,接下來就是導出數據庫,轉儲SQL文件,導出:
Peek 2020-05-28 23-27.gif
而後對SQL文件重命名:
image.png工具

這樣是爲了進行版本控制,便於後續的執行,此後的命名版本號都不得低於該版本,若是後續還要進行其餘操做,只需新建文件,而後編寫SQL便可。
點擊運行,查看數據庫裏的 flyway_schema_history 表單,有對應版本的SQL文件成功執行的記錄
image.png

值得注意的是,啓用flyway以後,hibernate的ddl-auto屬性要改成validate,即驗證,當實體定義的字段類型與SQL表裏的不一樣或者不存在時,會終止程序運行,防止字段出現衝突致使程序出現大問題。

總結

以後要想對字段進行修改,不只要修改實體字段,還要編寫SQL,進行版本的遷移,一篇好的博客,真的讓觀看的人恍然大悟,看了喜碩學長的博客,真的明白了好多,還順利的把flyway應用到了系統中,在此特別表達對喜碩學長的感謝。

本文做者:河北工業大學夢雲智開發團隊 張文達

相關文章
相關標籤/搜索