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的核心就是存储变化的XML,如例:

<?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的依赖

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

编制数据库变更文件

我大致分了分类:

  1. om/cdv/test/db_changelog/master.xml ——引用了下面三个文件c
  2. com/cdv/test/db_changelog/table.xml ——对数据库表的更改过程
  3. com/cdv/test/db_changelog/view.xml ——对视图的更改过程
  4. 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如下:
<?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>

Best Wishes For You!

时间: 2024-11-02 13:17:47

LiquiBase实战总结的相关文章

300+篇运维、数据库等实战资料免费下载(文章+PDF+视频,持续更新)

2017年已过去一半,在此小编为大家精心整理了2017上半年热点事件解析.实战技术资料以及特别策划短视频系列,希望可以帮助大家更深入地回顾上半年的技术热点,并储备更充足的技术干粮继续2017的下一半. PART 1 峰会回顾资料 云栖大会 [上海云栖大会]2017云栖大会上海峰会资料合计(现场视频+PDF下载) [成都云栖大会]2017云栖大会成都峰会资料合计(现场视频+PDF下载) [南京云栖大会]2017云栖大会南京峰会资料合计(现场视频+PDF下载) 技术峰会 [运维/DevOps峰会]

UI实战指南之留在电脑里的字体(一)

  进阶学习最实用教材!这一由@牛MO王涵 (BigDesign创始人/设计总监)编写的系列文章,从字体选择到提升设计感的技巧等都有涉猎,话题虽广,但全是实战过程中最关键的要素,而且是新手最关心的操作部分,学完直接上手工作 >>> 前言:我来了,这是U1系列新开篇章实战篇,不仅仅是适用于UI设计,甚至包含网页设计.平面设计.在文章中会更多的介绍一些操作上的教学,希望对新人们有帮助. 推荐字体 很多小伙伴在做设计的时候,无论是排版还是展示,都不太注重字体,或者有些太过于注重以至于用了很多种

品牌H5营销完全实战指南

那些百万PV的H5都是怎么做的?精心打造的H5要如何推广?H5技术将如何发展?本文一一为你解答 >>> 作者微信号,欢迎关注:Social Talent 对于H5这个名词想必大家已经很熟悉了,就在2014年,一项本来还不太成熟的技术在微信的社交舞台下大放异彩,让我们见识了"移动+社交"爆发的巨大能量. 然而这不是偶然,而是趋势.在具体介绍H5营销之前,我想和大家分享一份eMarketer的数据,其中显示了2012年-2018年品牌在不同媒体渠道的预算比重: 相比电视.

视频出炉:4月15日《阿里云RDS MySQL分支深度定制实战分享》

活动视频 <阿里云RDS MySQL分支深度定制实战分享> PDF地址:https://oss.aliyuncs.com/yqfiles/a5344b5961b367786a95620c636c4640.pdf 分享简介:阿里云RDS MySQL经过多年的积累,不断的进行性能优化,并定制了适合不同行业需求的功能,同时也向官方和社区贡献力量.本次主题主要介绍RDS MySQL分支的深度定制,包括功能扩展.资源管控.性能优化.数据安全.行业解决方案等. 分享者:赵建伟,现任阿里云数据库内核资深研发

113期:电子书《阿里巴巴技术实战2016年刊》重磅发布,免费下载!

本期头条   • [资料合集]首届阿里开源峰会回顾:讲义PDF+活动视频! • [在线峰会]即将直播:大数据技术峰会 • 微博红包技术最佳实践:架构及运维 • 阿里开源数据库AliSQL最佳实践   技术干货   如何使用好阿里云的网络安全隔离?深入分享阿里云ECS安全组实践经验 阿里云的ECS有经典网络和专有网络(VPC)两种网络类型.新业务建议优先考虑VPC网络,阿里云也将于年中开放经典网络的存量服务器向VPC网络迁移的功能.对于大家关注的云服务器的网络安全实践内容,我们特别邀请专家进行了深

阿里云Tech Insight 企业迁云实战专场强势来袭!

随着云计算的飞速发展,越来越多的企业用户选择以云平台为基础,来构建IT架构,聚焦企业的核心战略,以全面提升企业效率.那么,如何将IT架构高效平滑的迁移到云上,如何搭建高可靠高性能的业务系统,我们在Tech Insight的<企业迁云实战>专场将进行一一分享. <冰与火之歌 - Oracle上云研究> 数据库作为企业级应用的核心,也是迁云工作的最大挑战.该部分沉淀了阿里云在面向传统客户迁云技术服务过程中的各类问题和实践经验,从架构设计.实施部署.容灾方案,到产品选型.性能和可靠性测试

WKWebView与Js实战(OC版)

前言 上一篇专门讲解了WKWebView相关的所有类.代理的所有API.那么本篇讲些什么呢?当然是实战了! 本篇文章教大家如何使用WKWebView去实现常用的一些API操作.当然,也会有如何与JS交互的实战. 如果还没有阅读过WKWebView精讲(OC版),请先阅读,不然有可能看不懂下面所讲的内容. 效果图 通过本篇文章,至少可以学习到: OC如何给JS注入对象及JS如何给IOS发送数据 JS调用alert.confirm.prompt时,不采用JS原生提示,而是使用iOS原生来实现 如何监

探秘视频编码黑科技,窄带高清2.0视觉模型及场景实战

"黑科技"这个词已经成为了今年云栖大会的关键词.那么,在我们熟知的视频领域,什么才算是黑科技呢? 我们知道,在通常情况下,视频画质越好带宽费用肯定越高,带宽又是视频服务中占比很高的一项成本,很多开发者都在寻求效果与成本的平衡点.那么,有没有一种技术,能够在保证甚至提高视频画质的同时,降低带宽呢?如果有的话,小编觉得这一点可以算是黑科技了吧. 今天,小编就带大家来了解下刚刚在云栖大会上重磅发布的阿里云窄带高清2.0,看看它是如何超越压缩极限,在视觉效果和带宽成本中找到平衡的. 首先,我们

实战给AW_Blog插件添加缓存(续)

两年前的文章(实战给AW_Blog插件添加缓存)描述了一个Block Cache的实例,最近发现代码其实写的有点累赘,后台保存时自动触发刷新缓存并不需要自己去写刷新的动作,系统原生的Model继承类Mage_Core_Model_Abstract里已经有实现这个动作的代码,只需要简单的配置下变量就能实现.修改后的方案如下(Block类的所需修改代码不变) 打开AW_Blog_Model_Post这个文件,在头部定义一个常量,再定义一个变量 const CACHE_TAG = 'aw_blog';