springboot整合liqiubase


springboot整合liqiubase

springboot整合liqiubase

一. 概念

liqiubase是一個用於數據庫重構和遷移的開源工具,經過日誌文件的形式記錄數據庫的變動,而後執行日誌文件中的修改,將數據庫更新或者回滾到一致的狀態.它的目標是提供一種數據庫類型無關的解決方案,而後經過執行schema類型的文件來達到遷移.其主要的特色以下:html

  • 支持幾乎全部主流的數據庫,如MySQL, PostgreSQL, Oracle, Sql Server, DB2等;
  • 支持多開發者的協做維護;
  • 日誌文件支持多種格式,如XML, YAML, JSON, SQL等;
  • 支持多種運行方式,如命令行、Spring集成、Maven插件、Gradle插件等。

liquibase 官方文檔地址:http://www.liquibase.org/documentation/index.htmljava

二. 整合步驟

2.1 引入 liquibase 核心依賴
<dependency>
  <groupId>org.liquibase</groupId>
  <artifactId>liquibase-core</artifactId>
</dependency>

複製代碼
2.2 添加配置類(也能夠在application.yml中配置)
  1. 在代碼中添加LiquibaseConfig類,用於liquibase的基本配置
import javax.sql.DataSource;
import liquibase.integration.spring.SpringLiquibase;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class LiquibaseConfig {

  @Bean
  public SpringLiquibase liquibase(DataSource dataSource) {
    SpringLiquibase liquibase = new SpringLiquibase();
    liquibase.setDataSource(dataSource);
    //指定changelog的位置,這裏使用的一個master文件引用其餘文件的方式
    liquibase.setChangeLog("classpath:liquibase/master.xml");
    liquibase.setContexts("development,test,production");
    liquibase.setShouldRun(true);
    return liquibase;
  }

}
複製代碼
  1. application.yml中進行基本配置
# liquibase配置
liquibase:
 enabled: true  # 開啓liquibase 對數據庫的管理功能
 change-log: "classpath:/db/changelog/db.changelog-master.yaml"  #主配置文件的路徑
 contexts: dev # 引用立秋腳本的上下文,若是存在多個開發環境的話[生產\開發\測試\]
 check-change-log-location: true # 檢查changlog的文件夾是否存在
 rollback-file:  classPath:/data/backup.sql # 執行更新的時候寫入回滾的SQL文件

複製代碼
2.3 添加liquibase 核心文件

文件結構以下 mysql

master.xml是主配置文件,用於加載日誌文件或者是原有的系統數據庫文件spring

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <!--includeAll 標籤能夠把一個文件夾下的全部 changelog 都加載進來。若是單個加載能夠用 include。 includeAll 標籤裏有兩個屬性:path 和 relativeToChangelogFile。 <includeAll path="liquibase/changelogs/" relativeToChangelogFile="false"/> -->

    <include file="liquibase/changelogs/jdbc.sql" relativeToChangelogFile="false"/>
    <include file="liquibase/changelogs/changelog-1.0.xml" relativeToChangelogFile="false"/>
</databaseChangeLog>
複製代碼

changelog文件sql

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <!-- 建立表 -->
    <changeSet id="20200508001" author="xc">
        <createTable tableName="project_info">
            <column name="project_id" type="varchar(64)" encoding="utf8" remarks="項目id">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="project_name" type="varchar(255)" encoding="utf8" remarks="項目名字">
                <!-- 是否能夠爲空 -->
                <constraints nullable="false"/>
            </column>
            <column name="project_difficulty" type="float" encoding="utf8" remarks="項目難度"/>
            <column name="category_id" type="varchar(64)" encoding="utf8" remarks="項目類型類目編號"/>
            <column name="project_status" type="int(11)" encoding="utf8" remarks="項目狀態, 0招募中,1 進行中,2已完成,3失敗,4延期,5刪除"/>
            <column name="project_desc" type="varchar(512)" encoding="utf8" remarks="項目簡介"/>
            <column name="project_creater_id" type="varchar(64)" encoding="utf8" remarks="項目建立者id"/>
            <column name="team_id" type="varchar(64)" encoding="utf8" remarks="項目所屬團隊id"/>
            <column name="create_time" type="bigint(64)" encoding="utf8" remarks="建立時間"/>
            <column name="update_time" type="bigint(64)" encoding="utf8" remarks="更新時間"/>
        </createTable>
    </changeSet>
    <!-- 添加字段 -->
    <changeSet id="20200508002" author="xc"> 
        <addColumn tableName="project_info"> 
            <column name="phonenumber" type="varchar(255)" encoding="utf-8" remarks="項目負責人聯繫電話"/> 
        </addColumn> 
    </changeSet>
    <!-- 刪除字段 -->
    <changeSet id="20200508003" anthor="xc">
        <dropColumn tableName="project_info" columnName="phonenumber"/>
    </changeSet>

    <!-- 操做數據 -->
    <changeSet id="3" author="xc"> 
        <code type="section" width="100%"> 
        <insert tableName="project_info"> 
            <column name="id" valueNumeric="3"/> 
            <column name="project_name" value="Manassas Beer Company"/> 
        </insert> 
        <insert tableName="project_info"> 
            <column name="id" valueNumeric="4"/> 
            <column name="project_name" value="Harrisonburg Beer Distributors"/> 
        </insert> 
    </changeSet>
    <!-- 引入sql腳本文件 -->
    <changeSet id="6" author="xc"> 
        <sqlFile path="insert-distributor-data.sql"/> 
    </changeSet>
    <changeSet id="000000000000044" author="hc">
        <sqlFile dbms="mysql" endDelimiter=";;" encoding="UTF-8" path="config/liquibase/changelog/functions.sql"/>
    </changeSet>
    
    <changeSet>
        <!-- 外鍵、索引的建立語句會影響到本語句的執行,因此將其都放到另外的changeSet中單獨去執行 -->
		<modifySql dbms="mysql">
		    <append value="ENGINE=INNODB CHARSET=UTF8 COLLATE utf8_unicode_ci"/>
		</modifySql>
    </changeSet>


</databaseChangeLog>

複製代碼
相關文章
相關標籤/搜索