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>
编制数据库变更文件
我大致分了分类:
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如下:
<?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/40075493
LiquiBase实战总结的更多相关文章
- 使用 Liquibase 管理数据库版本 - SpringBoot 2.7 .2 实战基础
优雅哥 SpringBoot 2.7 .2 实战基础 - 05 -使用 Liquibase 管理数据库版本 在企业开发中,数据库版本管理好像是一个伪命题,大多项目都是通过 Power Designer ...
- spring boot实战(第十三篇)自动配置原理分析
前言 spring Boot中引入了自动配置,让开发者利用起来更加的简便.快捷,本篇讲利用RabbitMQ的自动配置为例讲分析下Spring Boot中的自动配置原理. 在上一篇末尾讲述了Spring ...
- Spring Boot 揭秘与实战 附录 - Spring Boot 公共配置
Spring Boot 公共配置,配置 application.properties/application.yml 文件中. 摘自:http://docs.spring.io/spring-boot ...
- Spring Boot 揭秘与实战(九) 应用监控篇 - HTTP 应用监控
文章目录 1. 快速开始 2. 监控和管理端点3. 定制端点 2.1. health 应用健康指标 2.2. info 查看应用信息 2.3. metrics 应用基本指标 2.4. trace 基本 ...
- Liquibase+spring 初步使用
现在的工作的项目中用了liquibase,感觉挺爽的,可以跟踪.管理数据库的重构.这对于很多需求变更较大的项目是非常不错的,特别是互联网的项目.(虽然互联网Nosql已经非常流行,不过俺觉得传统关系型 ...
- SSH实战 · 唯唯乐购项目(上)
前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...
- GitHub实战系列汇总篇
基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
随机推荐
- 【20191118会议】针对华为云CCE 问题总结
针对华为云CCE问题总结 如何购买CCE集群 可以分为测试环境和生产环境,针对使用范围进行购买集群. 测试环境 可以进行公用 生产环境建议使用单独集群 尤其针对部门大 耦合性不高 ,生产环境 建议使用 ...
- python返回值的缺省设置
有时候并不需要返回所有的值,但是原始函数的return语句中又有较多参数时: 方法一:修改原始返回值,只返回需要的参数 方法二:如果原始函数时第三方库或者python自带库,则直接修改可能不太好,于是 ...
- 读取xml时,报错:xml.etree.ElementTree.ParseError: no element found: line 20, column 9
读取xml时,出现报错:xml.etree.ElementTree.ParseError: no element found: line 20, column 9 原因是xml文件格式有问题,可以检查 ...
- 关于Go Modules的一些内容
安装 配置环境 启用Go Modules go mod在Go >= 1.13才默认启用,在Go >= 1.11已经开始支持了go mod. 设置环境变量 # 启用go module exp ...
- linux网络编程之简单的线程池实现
转眼间离15年的春节越来越近了,还有两周的工作时间貌似心已经不在异乡了,期待与家人团聚的日子,当然最后两周也得坚持站好最后一班岗,另外期待的日子往往是心里不能平静的,越是想着过年,反而日子过得越慢,于 ...
- 新闻系统——SQLHelper助手优化
在前面我们机房重构的时候已经用过了SQLHelper,但当时就是只会应用,知道利用SQLHelper能够帮助我们连接数据库,但对于怎样书写还是不太清楚,今天就揭开这层神秘的面纱,来真正体验如何来编写S ...
- Nginx入门(三)——正向代理
server { resolver 114.114.114.114; #指定DNS服务器IP地址 listen 443; location / { proxy_pass https://$host$r ...
- 7月新的开始 - Axure学习04 - 发布与预览、菜单和表格元件、流程图和连接点、标记元件
Axure 的发布与预览 1.发布 2.生成html文件 常规:指定浏览器.工具栏的生成 页面.页面说明.元件说明.交互.标志(logo和描述).字体.移动设备等 3.发布到Axshare Axure ...
- 利用Linux自带的logrotate管理日志
日常运维中,经常要对各类日志进行管理,清理,监控,尤其是因为应用bug,在1小时内就能写几十个G日志,导致磁盘爆满,系统挂掉. nohup.out,access.log,catalina.out 本文 ...
- django2.0报错Cannot import name 'urlresolvers'
刚刚从django1.1迁移到django2.0中出现一个意外的报错: google 了下,在stack.overflow上解释是说django2.0 把原来的 django.core.urlreso ...