1、概述

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

本文旨在将平时工作中常用的一些操作进行了整理,方便给大家提供参考。

2、理解databasechangelog和databasechangeloglock表

LiquiBase在执行changelog时,会在数据库中插入两张表:DATABASECHANGELOGDATABASECHANGELOGLOCK,分别记录changelog的执行日志和锁日志。

LiquiBase在执行changelog中的changeSet时,会首先查看DATABASECHANGELOG表,若是已经执行过,则会跳过(除非changeSet的runAlways属性为true),若是没有执行过,则执行并记录changelog日志;

changelog中的一个changeSet对应一个事务,在changeSet执行完后commit,若是出现错误则rollback;

<changeSet>标签的主要属性有:dom

  • runAlways:即便已经执行过,仍然每次都执行;注意: 因为DATABASECHANGELOG表中还记录了changeSet的MD5校验值MD5SUM,若是changeSet的idname没变,而内容变了,则因为MD5值变了,即便runAlways的值为True,执行也是失败的,会报错。这种状况应该使用runOnChange属性。
  • runOnChange:第一次的时候执行以及当changeSet的内容发生变化时执行。不受MD5校验值的约束。
  • runInTransaction:是否做为一个事务执行,默认为true。设置为false时须要当心:若是执行过程当中出错了则不会rollback,数据库极可能处于不一致的状态;

关于数据库liquibase表DATABASECHANGELOG 字段 MD5SUM:

  • 当changeSet为建立表,删除表,新增字段时 改变MD5SUM 的值
  • 当changeSet为loadDate或loadUpdateData 改变csv的值,改变MD5SUM 的值
  • 当数据库和MD5sum不一致时直接改数据库值会产生报错

3、changelog文件--支持XML

<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd
http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
<!-- ################### Table相关 ################### -->
<!-- 创建表 -->
<changeSet author="cavan" id="22.1.V1-1">
<preConditions onFail="MARK_RAN">
<not>
<tableExists tableName="school"/>
</not>
</preConditions>
<createTable tableName="school">
<!-- int类型 -->
<column name="school_id" type="INT" autoIncrement="true">
<constraints primaryKey="true" nullable="false"/>
</column> <!-- 字符串类型 -->
<column name="school_name" type="VARCHAR(100)">
<constraints nullable="true" unique="false"/>
</column> <!-- 文本类型 -->
<column name="address" type="TEXT"/> <!-- boolean类型 使用boolean或者tinyint(1)-->
<column name="is_top_ten" type="boolean" defaultValueBoolean="true"/>
<!-- 方式二
<column defaultValueNumeric="0" name="is_top_ten" type="tinyint(1)"/>
--> <column defaultValue="anonymity" name="created_by" type="VARCHAR(50)"/>
<column defaultValueComputed="CURRENT_TIMESTAMP" name="created_date" type="TIMESTAMP">
<constraints nullable="false"/>
</column>
<column defaultValueComputed="CURRENT_TIMESTAMP" name="last_modified_date" type="TIMESTAMP">
<constraints nullable="false"/>
</column>
<column defaultValue="anonymity" name="last_modified_by" type="VARCHAR(50)"/>
</createTable>
</changeSet> <changeSet author="cavan" id="22.1.V1-2">
<preConditions onFail="MARK_RAN">
<not>
<tableExists tableName="school_class"/>
</not>
</preConditions>
<createTable tableName="school_class">
<column name="class_id" type="INT">
<constraints primaryKey="true" nullable="false"/>
</column>
<column name="class_name" type="VARCHAR(100)">
<constraints nullable="true"/>
</column>
<column name="school_id" type="INT">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet> <!-- 删除表 -->
<changeSet author="cavan" id="22.1.V1-3">
<preConditions>
<tableExists tableName="school_class" />
</preConditions>
<dropTable tableName="school_class" />
</changeSet> <!-- 修改表名 -->
<changeSet author="cavan" id="22.1.V1-4">
<preConditions>
<tableExists tableName="school_class" />
</preConditions> <renameTable oldTableName="school_class"
newTableName="class_school"/>
</changeSet> <!-- ################### 其他相关表操作 ################### -->
<!-- 增加主键,单一主键 -->
<changeSet author="cavan" id="22.1.V2-1">
<addPrimaryKey columnNames="school_id"
constraintName="PRIMARY"
tableName="school"/>
</changeSet>
<!-- 增加主键,联合主键 -->
<changeSet author="cavan" id="22.1.V2-2">
<addPrimaryKey columnNames="school_id, school_name"
constraintName="PRIMARY"
tableName="school"/>
</changeSet> <!-- 创建索引,删除索引 -->
<changeSet author="cavan" id="22.1.V2-3">
<!-- 创建索引 -->
<createIndex indexName="school_id" tableName="school">
<column name="school"/>
</createIndex>
<!-- 删除索引 -->
<dropIndex indexName="school_id" tableName="school"/>
</changeSet> <!-- 增加外键约束 -->
<changeSet author="cavan" id="22.1.V2-4">
<addForeignKeyConstraint baseColumnNames="school_id"
baseTableName="school_class"
constraintName="school_class_ibfk_1"
deferrable="false"
initiallyDeferred="false"
onDelete="RESTRICT"
onUpdate="RESTRICT"
referencedColumnNames="school_id"
referencedTableName="school"/>
</changeSet> <changeSet author="cavan" id="22.1.V2-5">
<sql>
ALTER TABLE school MODIFY COLUMN last_modified_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
</sql>
</changeSet> <!-- ################### Column相关 ################### -->
<!-- 增加字段 -->
<changeSet author="cavan" id="22.1.V3-1">
<addColumn tableName="school_class">
<column name="school_name" type="VARCHAR(100)">
<constraints nullable="false"/>
</column>
</addColumn>
</changeSet> <!-- 删除字段 -->
<changeSet author="cavan" id="22.1.V3-2">
<dropColumn tableName="school">
<column name="created_by"/>
<column name="created_date"/>
<column name="last_modified_by"/>
<column name="last_modified_date"/>
</dropColumn>
</changeSet> <!-- 修改字段 -->
<changeSet author="cavan" id="22.1.V3-3">
<!-- 修改字段名称( 其实可以连带类型一起修改了 ) -->
<renameColumn tableName="school" oldColumnName="is_top_ten"
newColumnName="is_top_ten_new" columnDataType="varchar(20)"/>
<!-- 修改字段类型 -->
<modifyDataType tableName="school" columnName="school_name" newDataType="varchar(20)" />
</changeSet> <!-- ################### 数据相关 ################### -->
<!-- 增删改查数据 -->
<changeSet author="cavan" id="22.1.V4-1">
<insert tableName="school">
<column name="school_id" value="2"/>
<column name="school_name" value="qinghua"/>
<column name="created_by" value="anonymity"/>
<column name="created_date" valueDate="2021-07-20 15:51:53.0"/>
<column name="last_modified_date" valueDate="2021-07-20 15:51:53.0"/>
<column name="last_modified_by" value="anonymity"/>
</insert>
</changeSet> <changeSet author="cavan" id="22.1.V4-2">
<delete tableName="school">
<where>school_id='2'</where>
</delete>
</changeSet> <changeSet author="cavan" id="22.1.V4-3">
<update tableName="school">
<column name="school_name" value="beida"/>
<where>school_id='2'</where>
</update>
</changeSet> <!-- 基于SQL语句 -->
<changeSet author="cavan" id="22.1.V5-1">
<sql>
insert into school (school_id, school_name, is_top_ten) values (1, 'hafu', 1);
</sql>
</changeSet> <!-- 基于SQL文件 -->
<changeSet author="cavan" id="22.1.V5-2">
<sqlFile path="insert-data.sql"/>
</changeSet>
</databaseChangeLog>

参考链接:

博客:

https://blog.csdn.net/lqzkcx3/article/details/108384404

http://www.javashuo.com/article/p-cyylquuc-eb.html

官方网站:

https://docs.liquibase.com/change-types/home.html

liquibase常用操作的更多相关文章

  1. 【三】用Markdown写blog的常用操作

    本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...

  2. php模拟数据库常用操作效果

    test.php <?php header("Content-type:text/html;charset='utf8'"); error_reporting(E_ALL); ...

  3. Mac OS X常用操作入门指南

    前两天入手一个Macbook air,在装软件过程中摸索了一些基本操作,现就常用操作进行总结, 1关于触控板: 按下(不区分左右)            =鼠标左键 control+按下        ...

  4. mysql常用操作语句

    mysql常用操作语句 1.mysql -u root -p   2.mysql -h localhost -u root -p database_name 2.列出数据库: 1.show datab ...

  5. nodejs配置及cmd常用操作

    一.cmd常用操作 1.返回根目录cd\ 2.返回上层目录cd .. 3.查找当前目录下的所有文件dir 4.查找下层目录cd window 二.nodejs配置 Node.js安装包及源码下载地址为 ...

  6. Oracle常用操作——创建表空间、临时表空间、创建表分区、创建索引、锁表处理

    摘要:Oracle数据库的库表常用操作:创建与添加表空间.临时表空间.创建表分区.创建索引.锁表处理 1.表空间 ■  详细查看表空间使用状况,包括总大小,使用空间,使用率,剩余空间 --详细查看表空 ...

  7. python 异常处理、文件常用操作

    异常处理 http://www.jb51.net/article/95033.htm 文件常用操作 http://www.jb51.net/article/92946.htm

  8. byte数据的常用操作函数[转发]

    /// <summary> /// 本类提供了对byte数据的常用操作函数 /// </summary> public class ByteUtil { ','A','B',' ...

  9. Linux Shell数组常用操作详解

    Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...

  10. Python 基礎 - 字符串常用操作

    字符串常用操作 今天就介紹一下常用的字符串操作,都是以 Python3撰寫的 首字母變大寫 #!/usr/bin/env python3 # -*- coding:utf-8 -*- name = & ...

随机推荐

  1. 剑指offer004(Java)-只出现一次的数字(中等)

    题目: 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 .请你找出并返回那个只出现了一次的元素. 示例1: 输入:nums = [2,2,3,2] 输出:3 示例 ...

  2. 牛客网-SQL专项训练25

    ①批处理是指包含一条或多条T-SQL语句的语句组,下列选项中,关于批处理的规则描述正确的是(B) 解析: A选项:不能定义一个check约束后,立即在同一个批处理中使用: C选项:Create def ...

  3. 力扣205(java)-同构字符串(简单)

    题目: 给定两个字符串 s 和 t ,判断它们是否是同构的. 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的. 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序 ...

  4. 力扣482(java)-密钥格式化(简单)

    题目: 给定一个许可密钥字符串 s,仅由字母.数字字符和破折号组成.字符串由 n 个破折号分成 n + 1 组.你也会得到一个整数 k . 我们想要重新格式化字符串 s,使每一组包含 k 个字符,除了 ...

  5. 汽车之家:基于 Flink + Iceberg 的湖仓一体架构实践

    简介: 由汽车之家实时计算平台负责人邸星星在 4 月 17 日上海站 Meetup 分享的,基于 Flink + Iceberg 的湖仓一体架构实践. 内容简要: 一.数据仓库架构升级的背景 二.基于 ...

  6. [Trading] 关于短线交易 Day Trading 的知识

    短线交易员操纵市场,试图利用股票.期货和其他金融产品价值的短期波动. 以下是你需要知道的关于日交易的知识,包括免费的交易图表,交易策略,以及日交易软件和平台. https://www.thebalan ...

  7. [FAQ] 腾讯企业邮箱成员的名字如何多次更改 ?

    可以通过给成员的邮箱增加别名,先点击成员信息最右侧的 "编辑",在编辑页面顶部的 "更多操作" 这个按钮中,比较隐蔽. Refer:腾讯邮箱成员名字更改 Lin ...

  8. WPF 使用 VideoDrawing 播放视频

    本文告诉大家如何在 WPF 使用 VideoDrawing 进行视频播放 用这个方法有什么优势?其实只是想作为某个控件的背景,某个控件的背景使用视频而已 控件的背景使用 DrawingBrush 传入 ...

  9. GitHub 的 Action 接入 Stryker.NET 进行自动化测试单元测试鲁棒性

    假设有一个捣蛋的小伙伴加入了你的团队,这个捣蛋的小伙伴喜欢乱改代码,请问此时的单元测试能否拦住这些逗比行为?如果不能拦住逗比行为,是否代表着单元测试有所欠缺,或者有某些分支逻辑没有考虑到.本文将告诉大 ...

  10. 谷歌 hackbar 不能使用的问题

    谷歌 hackbar 不能使用的问题 下载 hackbar 插件:https://github.com/Mr-xn/hackbar2.1.3 解压文件,将其拖入 chrome 扩展程序中 点击详情,点 ...