本文介紹了springboot開啟數(shù)據(jù)庫遷移的flyway使用,分享給大家,具體如下:
一,首先我先了解下flyway是如何運轉(zhuǎn)的。
最簡單的方案是將flyway指向一個空數(shù)據(jù)庫。
它將嘗試找到其元數(shù)據(jù)表。當數(shù)據(jù)庫為空時,flyway將不會找到它, 而是創(chuàng)建它。您現(xiàn)在擁有一個名為schema_version的單個空表的數(shù)據(jù)庫 :
該表將用于跟蹤數(shù)據(jù)庫的狀態(tài)。之后,flyway將開始掃描應用程序的文件系統(tǒng)或類路徑進行遷移。它們可以用sql或java編寫。
然后根據(jù)其版本號對遷移進行排序,并按順序應用:
隨著應用每個遷移,元數(shù)據(jù)表將相應更新:
schema_version
隨著元數(shù)據(jù)和初始狀態(tài)的到位,我們現(xiàn)在可以談論遷移到較新的版本。
flyway將再次掃描應用程序的文件系統(tǒng)或類路徑進行遷移。根據(jù)元數(shù)據(jù)表檢查遷移。如果版本號低于或等于標記為當前版本的版本號,則忽略它們。
剩余的遷移是掛起的遷移:可用但未應用。
然后,他們通過版本號進行排序,并依次執(zhí)行:
該元數(shù)據(jù)表進行更新,因此:
schema_version
就是這樣!每當需要發(fā)展數(shù)據(jù)庫時,無論是結(jié)構(gòu)(ddl)還是參考數(shù)據(jù)(dml),只需創(chuàng)建一個版本號高于當前版本的新遷移。下一次flyway啟動時,它會發(fā)現(xiàn)并相應地升級數(shù)據(jù)庫。
二,flyway在spingboot的使用
一種途徑是通過spring boot的spring.jpa.hibernate.ddl-auto屬性將hibernate.hbm2ddl.auto屬性設(shè)置為create、 create-drop或update。例如,要把hibernate.hbm2ddl.auto設(shè)置為create-drop,我們可以在application.yml里加入如下內(nèi)容:
1
2
3
4
|
spring: jpa: hibernate: ddl-auto: create-drop |
然而,這對生產(chǎn)環(huán)境來說并不理想,因為應用程序每次重啟數(shù)據(jù)庫, schema就會被清空,從頭開始重建。它可以設(shè)置為update,但就算這樣,我們也不建議將其用于生產(chǎn)環(huán)境。
還有一個途徑。我們可以在schema.sql里定義schema。在第一次運行時,這么做沒有問題,但隨后每次啟動應用程序時,這個初始化腳本都會失敗,因為數(shù)據(jù)表已經(jīng)存在了。這就要求在書寫初始化腳本時格外注意,不要重復執(zhí)行那些已經(jīng)做過的工作。
一個比較好的選擇是使用數(shù)據(jù)庫遷移庫(database migration library)。它使用一系列數(shù)據(jù)庫腳本,而且會記錄哪些已經(jīng)用過了,不會多次運用同一個腳本。應用程序的每個部署包里都包含了這些腳本,數(shù)據(jù)庫可以和應用程序保持一致。spring boot為兩款流行的數(shù)據(jù)庫遷移庫提供了自動配置支持。
- Flyway(http://flywaydb.org)
- Liquibase(http://www.liquibase.org)
當你想要在spring boot里使用其中某一個庫時,只需在項目里加入對應的依賴,然后編寫腳本就可以了。讓我們先從flyway開始了解吧。
1. 用flyway定義數(shù)據(jù)庫遷移過程
flyway是一個非常簡單的開源數(shù)據(jù)庫遷移庫,使用sql來定義遷移腳本。它的理念是,每個腳本都有一個版本號, flyway會順序執(zhí)行這些腳本,讓數(shù)據(jù)庫達到期望的狀態(tài)。它也會記錄已執(zhí)行的腳本狀態(tài),不會重復執(zhí)行。在閱讀列表應用程序這里,我們先從一個沒有數(shù)據(jù)表和數(shù)據(jù)的空數(shù)據(jù)庫開始。因此,這個腳 本里需要先創(chuàng)建reader和book表,包含外鍵約束和初始化數(shù)據(jù)。代碼清單8-2就是從空數(shù)據(jù)庫到 可用狀態(tài)的flyway腳本。
flyway數(shù)據(jù)庫初始腳本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
create table reader ( id serial primary key, username varchar( 25 ) unique not null , password varchar( 25 ) not null , fullname varchar( 50 ) not null ); create table book ( id serial primary key, author varchar( 50 ) not null , description varchar( 1000 ) not null , isbn varchar( 10 ) not null , title varchar( 250 ) not null , reader_username varchar( 25 ) not null , foreign key (reader_username) references reader(username) ); create sequence hibernate_sequence; insert into reader (username, password, fullname) values ( 'craig' , 'password' , 'craig walls' ); |
如你所見, flyway腳本就是sql。讓其發(fā)揮作用的是其在classpath里的位置和文件名。flyway腳本都遵循一個命名規(guī)范,含有版本號,具體如圖8-1所示。
所有flyway腳本的名字都以大寫字母v開頭,隨后是腳本的版本號。后面跟著兩個下劃線和對腳本的描述。因為這是整個遷移過程中的第一個腳本,所以它的版本是1。描述可以很靈活,主要用來幫助理解腳本的用途。稍后我們需要向數(shù)據(jù)庫添加新表,或者向已有數(shù)據(jù)表添加新字段??梢栽賱?chuàng)建一個腳本,標明版本號為2。flyway腳本需要放在相對于應用程序classpath根路徑的/db/migration路徑下。因此,項目中, 腳本需要放在src/main/resources/db/migration里。你還需要將spring.jpa.hibernate.ddl-auto設(shè)置為none,由此告知hibernate不要創(chuàng)建數(shù)據(jù)表。這關(guān)系到application.yml中的如下內(nèi)容:
1
2
3
4
|
spring: jpa: hibernate: ddl-auto: none |
剩下的就是將flyway添加為項目依賴。在gradle里,此依賴是這樣的:
1
|
compile(“org.flywaydb:flyway-core”) |
在maven項目里, 是這樣的:
1
2
3
4
|
<dependency> <groupid>org.flywayfb</groupid> <artifactid>flyway-core</artifactid> </dependency> |
在應用程序部署并運行起來后, spring boot會檢測到classpath里的flyway,自動配置所需的 bean。 flyway會依次查看/db/migration里的腳本,如果沒有執(zhí)行過就運行這些腳本。每個腳本都執(zhí)行過后,向schema_version表里寫一條記錄。應用程序下次啟動時,flyway會先看schema_version里的記錄,跳過那些腳本。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://blog.csdn.net/u010963948/article/details/77801431