LiquiBase實戰總結

LiquiBase概述

Liquibase是一個用於跟蹤、管理和應用數據庫變化的開源的數據庫重構工具。它將全部數據庫的變化(包括結構和數據)都保存在XML文件中,便於版本控制。mysql

Liquibase具有以下特性:
* 不依賴於特定的數據庫,目前支持包括Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL/Caché等12種數據庫,這樣在數據庫的部署和升級環節可幫助應用系統支持多數據庫。
* 提供數據庫比較功能,比較結果保存在XML中,基於該XML你可用Liquibase輕鬆部署或升級數據庫。
* 以XML存儲數據庫變化,其中以做者和ID惟一標識一個變化(ChangSet),支持數據庫變化的合併,所以支持多開發人員同時工做。
* 在數據庫中保存數據庫修改歷史(DatabaseChangeHistory),在數據庫升級時自動跳過已應用的變化(ChangSet)。
* 提供變化應用的回滾功能,可按時間、數量或標籤(tag)回滾已應用的變化。經過這種方式,開發人員可輕易的還原數據庫在任什麼時候間點的狀態。
* 可生成數據庫修改文檔(HTML格式)

* 提供數據重構的獨立的IDE和Eclipse插件。

Liquibase的核心就是存儲變化的XML,如例:spring

<?xml version="1.0" encoding="UTF-8"?> 
<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.6"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.6
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.6.xsd">
 
    <changeSet id="1" author="netbug_nb">
        <createTable tableName="department">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(50)">
                <constraints nullable="false"/>
            </column>
            <column name="active" type="boolean" defaultValue="1"/>
        </createTable>
    </changeSet> 
</databaseChangeLog>

其中,changeSet包含不一樣的數據庫變化,幾乎涵蓋了全部的數據庫變化類型,具體支持的類型要看API,我這裏給幾個例子:

* 建立和刪除表、視圖、存儲過程、主鍵、外鍵、索引等

* 重命名錶、視圖、列等

* 加入列缺省值、惟一約束、非空約束等

* 合併兩個列

* 在一個表的數據的基礎上建立一個字典表

除此以外,Liquibase還容許你運行本身的Sql腳本、執行Shell程序。
在ivy.xml中引入Liguibase的依賴sql

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
 
        ...
        <!-- 數據庫相關內容 -->
        ...
        <dependency org="org.liquibase" name="liquibase-core" rev="2.0.4" conf="compile->compile(*),master(*);runtime->runtime(*)" transitive="false"/>
 
        ...
 
    </dependencies>
</ivy-module>

將Liquibase集成到spring框架

 

<beans>
    ...
 
    <!-- 數據庫事務管理 -->
    <bean id="tm" 
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="ds" />
    </bean>
 
    <!-- 初始化數據庫 -->
    <bean id="liquibase" class="liquibase.integration.spring.SpringLiquibase">
        <property name="dataSource" ref="ds" />
        <property name="changeLog" value="classpath:com/cdv/test/db_changelog/master.xml" />
        <property name="contexts" value="production" />
    </bean>
</beans>

 

編制數據庫變動文件
我大體分了分類:

    om/cdv/test/db_changelog/master.xml ——引用了下面三個文件c
    com/cdv/test/db_changelog/table.xml ——對數據庫表的更改過程
    com/cdv/test/db_changelog/view.xml ——對視圖的更改過程
    com/cdv/test/db_changelog/data.xml ——對數據的操做


    com/cdv/test/db_changelog/master.xml以下:數據庫

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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-2.0.xsd">
    <include file="table.xml" relativeToChangelogFile="true" />
    <include file="view.xml" relativeToChangelogFile="true" />
    <include file="data.xml" relativeToChangelogFile="true" />
</databaseChangeLog>

com/cdv/test/db_changelog/table.xml以下:apache

 

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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-2.0.xsd">
 
    <!-- OOOOOO注意: 本文件不要格式化OOOOOO -->
 
    <changeSet author="netbug_nb" id="20131128-test" context="production">
        <createTable tableName="bf_role">
            <column name="rolename" type="NVARCHAR(100)"><constraints nullable="false" primaryKey="true" primaryKeyName="PK_ROLE" /></column>
            <column name="roleconfig" type="TEXT"></column>
            <column name="readonly" type="TINYINT"><constraints nullable="false" /></column>
        </createTable>
        <createTable tableName="bf_user">
            <column name="userid" type="NVARCHAR(100)"><constraints nullable="false" primaryKey="true" primaryKeyName="PK_USER" /></column>
            <column name="username" type="NVARCHAR(100)"><constraints nullable="false" /></column>
            <column name="password" type="NVARCHAR(32)"><constraints nullable="false" /></column>
            <column name="rolename" type="NVARCHAR(100)"><constraints nullable="false" /></column>
            <column name="departmentid" type="NVARCHAR(100)"></column>
            <column name="email" type="NVARCHAR(255)"></column>
            <column name="cellphone" type="NVARCHAR(14)"></column>
            <column name="telphone" type="NVARCHAR(20)"></column>
            <column name="columns" type="TEXT"></column>
            <column name="disabled" type="TINYINT"><constraints nullable="false" /></column>
            <column name="readonly" type="TINYINT"><constraints nullable="false" /></column>
        </createTable>
 
    <changeSet author="netbug_nb" id="20140107-test" context="production">
        <addColumn tableName="bf_synctask">
            <column name="content" type="TEXT"></column>
        </addColumn>
        <createSequence sequenceName="BF_SQ_SYNCTASKID" startValue="0" incrementBy="1" />
    </changeSet>
 
    <changeSet author="netbug_nb" id="20140109-test" context="production">
        <modifyDataType tableName="bf_file" columnName="hash" newDataType="NVARCHAR(50)"/>
        <addColumn tableName="bf_file">
            <column name="infection" type="TEXT"></column>
        </addColumn>
    </changeSet>
</databaseChangeLog>

 

com/cdv/test/db_changelog/data.xml以下:框架

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<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-2.0.xsd">
 
    <changeSet author="sun-wei" id="20131128-test-initdata">
 
        <!-- 初始化角色 -->
        <insert tableName="bf_role">
            <column name="rolename" value="系統管理員" />
            <column name="readonly" valueBoolean="true" />
        </insert>
        <insert tableName="bf_role">
            <column name="rolename" value="維護管理員" />
            <column name="readonly" valueBoolean="true" />
        </insert>
 
        <!-- 初始化用戶 -->
        <insert tableName="bf_user">
            <column name="userid" value="admin" />
            <column name="username" value="系統管理員" />
            <column name="password" value="xxxxxxxxxxxx" />
            <column name="rolename" value="系統管理員" />
            <column name="disabled" valueBoolean="false" />
            <column name="readonly" valueBoolean="true" />
        </insert>
        <insert tableName="bf_user">
            <column name="userid" value="manager" />
            <column name="username" value="維護管理員" />
            <column name="password" value="xxxxxxxxxxxxx" />
            <column name="rolename" value="維護管理員" />
            <column name="disabled" valueBoolean="false" />
            <column name="readonly" valueBoolean="true" />
        </insert>
    </changeSet>
 
</databaseChangeLog>

OK,如今啓動你的Web應用
啓動後,Liquibase將自動幫你建立數據庫表字段視圖等、之後數據庫結構發生任何變化,去添加ChangeSet吧,它會幫你修改數據庫的,不須要你直接操做數據庫了。
Liquibase經過在你的數據庫中增長兩個它本身表來判斷和處理數據庫的變化。
另外,Liquibase還支持不一樣數據的的方言哦,經過在ChangeSet中增長dbms屬性便可達到目的,好比工具

<changeSet author="xxx" id="xxxx-id-1" context="production" dbms="mssql">
        ...
    </changeSet>
 
    <changeSet author="xxx" id="xxxx-id-1" context="production" dbms="mysql">
        ...
    </changeSet>

本文轉載自:https://blog.csdn.net/Netbug_NB/article/details/40075493ui

相關文章
相關標籤/搜索