Liquibase

一、Liquibase

Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制。

Liquibase具备如下特性:   

* 不依赖于特定的数据库,目前支持包括Oracle/Sql Server/DB2/MySql/Sybase/PostgreSQL/Caché等12种         数据库,这样在数据库的部署和升级环节可帮助应用系统支持多数据库。   

* 提供数据库比较功能,比较结果保存在XML中,基于该XML你可用Liquibase轻松部署或升级数据库。   

* 以XML存储数据库变化,其中以作者和ID唯一标识一个变化(ChangSet),支持数据库变化的合并,因此      支持多开发人员同时工作。   

* 在数据库中保存数据库修改历史(DatabaseChangeHistory),在数据库升级时自动跳过已应用的变化     (ChangSet)。   

* 提供变化应用的回滚功能,可按时间、数量或标签(tag)回滚已应用的变化。通过这种方式,开发人员可        轻易的还原数据库在任何时间点的状态。   

* 可生成数据库修改文档(HTML格式)   

* 提供数据重构的独立的IDE和Eclipse插件

二、使用在使用的过程中,Liquibase的作用就像是写好sql或者DML语句来完成数据库的更新,那么通俗些来说:将数据库schema的改变(table的创建、column的改变、index的改变......)以及数据本身内容的改变(insert 、 update 、 delete),用Liquibase定义的语法写成xml格式的=change log,同时也会在数据库中创建一张databasechangelog的table,用来记录db更新了那些change log,当xml新增更多的change log后,跟db里的版本比较,就可得知那些未同步的change log有哪些,下次同步时,就会同步这些未同步的change log,在这点上,Liquibase和现在大名鼎鼎的git很相似。

在这里需要注意一点:change log的文档,一旦同步过后,文档中对应的id以及文档路径等tag改变,那么文档中的改变就会当成新的change log,再次被同步到数据库中

三、使用

  1、同步xml到db

   (1)  创建table

<?xml version="1.0" encoding="UTF-8"?>

<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">

  <!-- 建立 uesr table -->
    <changeSet id="create-user-table" author="kent">
        <createTable tableName="user">
            <column name="first_name" type="varchar(50)">
                <constraints nullable="false"/>
            </column>
            <column name="last_name" type="varchar(50)">
            </column>
        </createTable>
    </changeSet>

</databaseChangeLog>

 
如上操作即可完成 create table的操作 在结合maven使用时,执行mvn liquibase:update,db里面会产生三张table

    databasechangelog是記錄同步用的,

    databasechangeloglock是做locking的

   user 則是上面的change log中的createTable建立的

其中前两个时liquibase管理,不需要管理,不过有兴趣的话 可以看下对应的表记录,就可以发现每次同步的操作都有记录

  (2)  update table

  若是这个时候xml文档中添加如下的内容
  

<?xml version="1.0" encoding="UTF-8"?>

<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">

   <!--省略前面的create table的操作-->
    <!-- 在user table加入 address column -->
    <changeSet id="addColumn-example" author="kent">
        <addColumn catalogName="mydb" schemaName="public" tableName="user">
            <column name="address" type="varchar(255)"/>
        </addColumn>
    </changeSet>

</databaseChangeLog>
 

 那么在此执行 mvn liquibase:update 后,user table就会多出新增的column。在这里需要注意点,由于create-user-table author=&quot;kent&quot;前面被执行过来,同时对应的内容未发生改变,所以不会在此被执行。

  (3)  insert table

<?xml version="1.0" encoding="UTF-8"?>

<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">
    <!-- insert兩筆測試資料 -->
    <changeSet id="insert-example" author="kent" >
        <insert catalogName="mydb" schemaName="public" tableName="user">
            <column name="first_name" value="kent"/>
            <column name="last_name" value="chiu"/>
        </insert>
        <insert catalogName="mydb" schemaName="public" tableName="user">
            <column name="first_name" value="cindy"/>
            <column name="last_name" value="chiu"/>
        </insert>
    </changeSet>
</databaseChangeLog>

 
mvn liquibase:update 之后 数据库会增加两条记录

关于版本说明

在实际上,只要db的schema有做改变的,都是从xml进行改变,那么若是资料内容发生改变,则根据实际情况看要不要从change log改变。必要的预设资料可以在change log中进行设定。通过insert tag来建,减少每次重建table都要重新添加数据的步骤;同时也可结合其他指令,使数据库回到特定的版本,是不是和git很像

四、从数据库产生changelog.xml

对于现有的db,可以通过generateChangeLog从数据库中产生change log ,再以这个change log为基础,针对后续的改变,再通过liquibase管理(xml -- db);需要注意在通过generateChangeLog进行导出时,预设时只有schema(table/view/column/index/foreignkey/primarykey/uniqueconstraint),在产生数据时,不需要指定diffTypes参数,若是有其他的内容需要产生,则必须指定diffTypes参数

若是想只导出数据

diffTypes = data,只有数据,没有schema的信息;数据也可导出csv或者导入csv

只生成数据
mvn liquibase:generateChangeLog -Dliquibase.diffTypes=data

同时生产schema和datas
mvn liquibase:generateChangeLog -Dliquibase.diffTypes=tables,views,columns,indexs,foreignkeys,primarykeys,uniqueconstraints,data
----------------------------------------------------------------------------------
以上只是liquibase的简单描述,详情请见:http://www.liquibase.org/documentation/databasechangelog.html




猜你喜欢

转载自dalan-123.iteye.com/blog/2251766