簡介
在我們開發的過程中,數據庫的部署和管理如果只用sql文件導入的方式來處理會有一個問題,就是每次版本更新的時候,你都需要清空數據庫,再導入sql文件,當然你也可以在每次更新版本的時候把數據庫的修改寫成腳本,liquibase就是來做這件事的,他的功能更豐富,支持正向遷移、回滾,數據填充,本文只介紹如何實現正向遷移和數據填充。
特點
- 目前支持包括Oracle/SqlServer/DB2/MySql/Sybase/PostgreSQL/Cache 等12種數據庫,這樣在數據庫的部署和升級環節可幫助應用系統支持多數據庫。
- 以XML存儲數據庫變化,其中以作者和ID唯一標識一個變化(changset),支持數據庫變化的合並,因此支持多開發人員同時合作。
- 在數據庫中保存數據庫修改歷史,在數據庫升級時自動跳過以應用的變化(ChangSet)。
- 提供變化應用的回滾功能,可按時間,數量或標簽(tag)回滾已應用的變化。通過這種方式,開發人員可輕易的還原數據庫在任何時間點的狀態。
開始
-
導入依賴
<dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency>
當然這個功能是依賴數據庫的,所以前提是保證數據連接正常,我用的是mysql5.7數據庫
-
設置配置文件
spring: liquibase: enabled: true change-log: classpath:/db/changelog/master.xml
這個是設置主配置文件,在項目啟動時,springboot會自動加載這個配置並根據配置去執行你寫的所有數據庫相關的配置(表結構創建和數據填充)。
如果不設置,默認會去加載 classpath:/db/changelog/db.changelog-master.xml
設置完成后去/db/changelog/目錄下創建master.xml文件,看一下主配置文件的內容。
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <!-- includeAll可以把db/changelog/migrate/內所有的文件全部引用並執行 --> <includeAll path="db/changelog/migrate/" relativeToChangelogFile="false" /> </databaseChangeLog>
這里建議使用xml格式,當然你也可以只用yml和json
-
創建表結構,修改表結構等操作
接下來我們需要在db/changelog/migrate/文件內創建你需要創建的表結構,或者修改表結構的配置,看一個例子:
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <changeSet id="1" author="sheng"> <createTable tableName="users" remarks="用戶表"> <column name="id" type="int" remarks="用戶ID,主鍵" autoIncrement="true"> <constraints nullable="false" primaryKey="true" primaryKeyName="id"/> </column> <column name="name" type="varchar(40)" remarks="用戶名"> <constraints nullable="false"/> </column> <column name="password" type="varchar(40)" remarks="密碼"> <constraints nullable="false"/> </column> <column name="token" type="varchar(40)" remarks="token" defaultValue=""/> <column name="created_at" type="datetime" remarks="創建時間"/> <column name="sort" type="int" defaultValue="1" remarks="排序"/> <column name="last_login_time" type="datetime" remarks="最后一次登錄時間"/> <column name="head_pic" type="text" remarks="頭像"> <constraints nullable="false"/> </column> </createTable> </changeSet> </databaseChangeLog>
這是創建一個用戶表。
目錄結構是這樣的
這里有一個文件名的問題,個人習慣是用當天的時間+操作類型+表名來定義的,你也可以有自己的規划,只需要在includeAll修改path就可以了,注意,主配置文件的位置,可能會有循環調用的問題。
現在就可以啟動項目,看一下數據庫已經創建好了users表了,同時還創建了兩個表(databasechangelog,databasechangeloglock),用來實現你每次 遷移、回滾等操作。
-
數據填充
數據填充功能還是很有用的,使用起來也很簡單,只需要在主配置文件內加入loadData標簽,我們來看一下。
<?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd"> <!-- includeAll可以把db/changelog/migrate/內所有的文件全部引用並執行 --> <includeAll path="db/changelog/migrate/" relativeToChangelogFile="false" /> <changeSet id="6" author="sheng"> <!-- loadData 這里主要的字段是file,標識了你csv文件的位置 --> <loadData encoding="UTF-8" tableName="users" file="db/changelog/seed/users.csv" separator=","> <column name="id" type="NUMERIC"/> <column name="name" type="STRING"/> <column name="password" type="STRING"/> <column name="token" type="STRING"/> <column name="created_at" type="timestamp"/> <column name="sort" type="NUMERIC"/> <column name="last_login_time" type="timestamp"/> <column name="head_pic" type="STRING"/> </loadData> </changeSet> </databaseChangeLog>
數據填充一般是我們項目初始化的一些數據,比如超級管理員。這里file字段表示的是需要導入數據的CSV文件的位置;看一個CSV文件的例子:
"id","name","password","token","created_at","sort","last_login_time","head_pic" "1","admin","123456","","","1","","/img/head_pic/2019040917510740548.jpg" "2","admin1","123456","","","1","","/img/head_pic/2019040917510740548.jpg" "3","admin2","123456","","","1","","/img/head_pic/2019040917510740548.jpg" "4","admin3","123456","","","1","","/img/head_pic/2019040917510740548.jpg" "5","admin4","123456","","","1","","/img/head_pic/2019040917510740548.jpg"
字段名要在第一行。
這里有一個問題,因為連接數據庫的操作是先執行的,所以需要先創建數據庫才能使用此功能。
最后,文件目錄大致是這樣的:
注意事項
- ChangeSet必須填寫author。
- Liquibase禁止對業務數據進行sql操作。
- 所有表,列要加remarks進行注釋。
- 已經執行過的ChangeSet嚴禁修改。
- 不要隨便升級項目liquibase版本,特別是大版本升級。不同版本ChangeSet MD5SUM的算法不一樣。
最后,如果想看更詳細的相關操作可以去看一下這篇文章:
[https://blog.csdn.net/u012934325/article/details/100652805]: