liquibase学习和使用
文章目录
- liquibase学习
- 介绍
- 数据库更新日志和数据库更新日志锁定
- 相关概念
- changelog
- changeset的属性
- precondition
- sql样例
- Contexts
- sql样例
- Label
- sql样例
- 文件格式
- sql样例
- 其他格式用的时候在补充
- 跟踪表
- DATABASECHANGELOGLOCK (数据库更改日志锁定表)
- DATABASECHANGELOG (数据库更新日志表)
- 命令
- update
- 执行情况
- liquibase使用
- 基于SpringBoot maven集成Liquibase
liquibase学习
介绍
Liquibase 是一种数据库结构更改管理解决方案,能够从开发到生产更快、更安全地修订和发布数据库更改。
数据库更新日志和数据库更新日志锁定
部署更改时,Liquibase 会在数据库中创建两个表:DATABASECHANGELOG 和 DATABASECHANGELOGLOCK。
数据库更改日志表跟踪已部署的更改,以便您有记录。Liquibase 将变更日志文件中的变更集与 DATABASECHANGELOG 跟踪表进行比较,并仅部署新的变更集。
DATABASECHANGELOGLOCK 可防止 Liquibase 的多个实例同时更新数据库。该表在部署期间管理对 DATABASECHANGELOG 表的访问,并确保只有一个 Liquibase 实例正在更新数据库。
相关概念
changelog
Liquibase 使用changelog按顺序列出对数据库所做的所有更改。
changelog单个更改单元称为changeset,changeset是 Liquibase 中变化的基本单位。将所有changeset存储在changelog中
不同的文件格式(sql,yaml,xml,json)对changeset的描述是不一样的,只是sql文件格式学习成本最低
changset是由changelog的文件路径和author属性和id属性唯一确认的
changeset的属性
precondition
precondition是添加到changelog或单个changeset的标记,用于根据数据库的状态控制更新的执行。通过precondition,您可以指定changeset的安全性和标准化要求。如果changeset上的precondition失败,Liquibase 不会部署该changeset。不过也可以设置不同的属性控制错误的处理方式。
该属性可以在changeset执行前进行检查。
sql文件格式的changelog只支持sqlCheck,其他文件格式支持的检查会多一些。
sql样例
--liquibase formatted sql--changeset Liquibase User:1
--precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM primary_table
--comment: /*comments should go after preCondition. If they are located before the precondition, then Liquibase usually gives error.*/
create table primary_table ( id int primary key,name varchar(50) not null,address1 varchar(50),address2 varchar(50),city varchar(30)
)
Contexts
使用该属性可以在进行更新数据库时,根据输入的参数对changeset进行过滤;属性值是不区分大小写的字符串。具体的判断逻辑可以参考该链接
sql样例
--changeset bob:1 contextFilter:test
insert into news (id, title) values (1, 'Liquibase 0.8 Released')
Label
使用该属性可以在进行更新数据库时,根据输入的参数对changeset进行过滤;属性值是不区分大小写的字符串。label和contexts的具体的判断逻辑可以参考该链接
sql样例
--liquibase formatted sql--changeset Liquibase User:1 labels:1.0
create table primary_table ( id int primary key,name varchar(50) not null,address1 varchar(50),address2 varchar(50),city varchar(30)
)
文件格式
sql样例
/*changelog标准开头*/
--liquibase formatted sql/*changeset标准开头 author:id*/
--changeset nvoxland:1
/* 设置前置条件属性 */
--preconditions onFail:HALT onError:HALT
/* 设置前置条件sql check,sql格式支支持sqlcheck */
--precondition-sql-check expectedResult:0 SELECT COUNT(*) FROM my_table
create table test1 (id int primary key,name varchar(255)
);
/*rollback标准开头*/
--rollback drop table test1;--changeset nvoxland:2
insert into test1 (id, name) values (1, ‘name 1′);
insert into test1 (id, name) values (2, ‘name 2′);--changeset nvoxland:3 dbms:oracle
create sequence seq_test;
其他格式用的时候在补充
跟踪表
DATABASECHANGELOGLOCK (数据库更改日志锁定表)
Liquibase 使用 DATABASECHANGELOGLOCK 表来确保一次只运行一个 Liquibase 实例。
当您进行数据库更新时,Liquibase 会从 DATABASECHANGELOG 表中读取数据,以确定需要运行哪些变更集。为了避免并发更新之间的冲突(如果多个开发人员使用相同的数据库实例,或者集群中的多个服务器在启动时自动运行 Liquibase,则可能会发生冲突),当更新当前正在运行时,DATABASECHANGELOGLOCK 表将该列设置为 1。如果您在此期间进行其他更新,Liquibase 会等到锁释放后再运行它。
DATABASECHANGELOG (数据库更新日志表)
Liquibase 使用 DATABASECHANGELOG 表来跟踪运行了哪些变更集。如果数据库中不存在该表,Liquibase 会自动创建一个表。
命令
Liquibase 附带的几个命令,可以帮助迁移和更改数据库。
主要包含start命令、update命令、rollback命令、inspection 命令、tracking 命令、Maintenance 命令、checks 命令、Hub 命令。
Liquibase命令详细
update
该命令将部署changelog文件中尚未部署到数据库的任何更改。
运行该命令时,Liquibase 会按顺序读取changelog文件中的changset,然后将author 和 id的唯一标识符与存储在 DATABASECHANGELOG 表中的值进行比较。
执行情况
-
如果唯一标识符不存在,Liquibase 会将changset应用于数据库。
-
如果存在唯一标识符,则将changset的 MD5Sum 与数据库中的 MD<>Sum 进行比较。如果它们不同,Liquibase 将生成一条错误消息,声明有人意外更改了changeset。但是,如果将changeset的属性runOnChange or runAlways 设置为True ,Liquibase 将重新应用changeset。
liquibase使用
基于SpringBoot maven集成Liquibase
- 打开pom.xml,添加liquibase依赖
<dependency><groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId>
</dependency>
- 打开spring配置文件application.properties,添加以下配置
spring:datasource:url: jdbc:postgresql://localhost:5432/yourdatabaseusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driverliquibase:#是否启用liquibaseenabled: truechange-log: classpath:db/changelog/changelog.yaml#changlog生效的上下文contexts: dev#第一次执行时,是否清空数据库drop-first: true#changelog生效的标签labels: dev
- 在resource文件夹下创建db/changelog/changelog.yaml文件,然后填充以下内容
databaseChangeLog:- includeAll:path: db/changelog/sql/
- 然后就可以在db/changelog/sql/文件夹创建你自己的changeset sql格式的文件了;建议文件的命令使用有意义的版本和名字进行命名,比如:01-01-modify-user-table.sql。
- sql文件样例
-- liquibase formatted sql--changeset liming:1 ranOn: 2019-07-01 11:00:00.000000000 +0000
create table user
(id bigint auto_incrementprimary key,name varchar(255) not null
);--changeset liming:2 ranOn: 2019-07-01 11:00:00.000000000 +0000
insert into user (name) values ('liming');
- 部署changelog
6.1.直接启动程序就可以实现改变
6.2. 在pom.xml中添加liquibase-maven-plugin插件,使用提供的update功能可以实现改变
相关文章:
liquibase学习和使用
文章目录liquibase学习介绍数据库更新日志和数据库更新日志锁定相关概念changelogchangeset的属性preconditionsql样例Contextssql样例Labelsql样例文件格式sql样例其他格式用的时候在补充跟踪表DATABASECHANGELOGLOCK (数据库更改日志锁定表)DATABASECH…...
redhawk:Low Power Analysis
1.rush current与switch cell 在standby状态下为了控制leakage power我们选择power gating的设计方式,使用power switch cell关闭block/power domain的电源。 power switch的基本介绍可见: 低功耗设计-Power Switch power switch的table中有四种状态,…...
24- 深度学习的模型保存和加载 (TensorFlow系列) (深度学习)
知识要点 keras 保存成hdf5文件, 1.保存模型和参数, 2.只保存参数 1.保存模型和参数 save_modelcallback ModelCheckpoint2. 只保存参数 save_weightscallback ModelCheckpoint save_weights_only True 保存模型: 案例数据: Fashion-MNIST总共有十个类别的图像model.save_w…...
【Echarts图例点击事件】自定义Echarts图例legend点击事件(已解决)
目录先睹为快(效果)1、实现Echarts多条曲线2、点击echarts触发接口请求2.1 先默认隐藏部分数据2.2 自定义legend图例点击事件3、源码下载地址(解压即用)**【写在前面】**这下我又不得不说了,还是客户现场使用时想查询一…...
uniapp-首页配置
为了获取到后台服务器发来的数据,需要配置相应的网络地址。位置在main.js入口文件中。 import { $http } from escook/request-miniprogramuni.$http $http // 配置请求根路径 $http.baseUrl https://api-hmugo-web.itheima.net// 请求开始之前做一些事情 $http.…...
支持DDR5,超频更简单,小雕够给力,技嘉B760M小雕WIFI主板上手
目前13代酷睿已经全员集结了,其中全新的i5 13490F应该依然会备受欢迎,当然了,刚上市不久的13代酷睿价格方面还不是很有吸引力,好在12代酷睿在新一代主板上面依然可用,所以预算有限的朋友,完全可用继续使用1…...
fengMap 自定义dom 偏离实际位置;缩放时飘出地图所在区域
目录 一、问题 二、原因及解决方法 三、总结 一、问题 1.前人写了一份代码,很奇怪。使用 new fengmap.FMCompositeMarker添加的复合覆盖物位置是正常的,缩放的时候也是正常的,仍然处于地图内部;但是new fengmap.FMDomMarker添加…...
TryHackMe-黑我杯
黑我杯 相信我们大家在TryHackMe的日积月累都学到了不少东西,从纯萌新到oscp再到更高 我很高兴能将国内各thm玩家聚集到一起,构建一个更好的学习环境和氛围 本次娱乐分两场: Offensive Pentesting — 中等难度Junior Penetration — 容易难…...
【JAVA程序设计】【C00109】基于SSM(非maven)的员工工资管理系统
基于SSM(非maven)的员工工资管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架非maven开发的企业工资管理系统共分为二个角色:系统管理员、员工 管理员角色包含以下功能: 系统后台登陆、管理员管理、员工信…...
《计算机原理》——HelloWorld.cpp如何运行的
学校《计算机原理》开课啦!特此开辟专栏,将一些知识作为笔记,记录下来。 前言 本篇博客知识点来源于educoder的相关题目 1. 相关知识 1.1 计算机语言 计算机语言是人与计算机之间通讯的语言,计算机语言包括编写计算机程序的字符…...
【面试题】在JS循环中使用await会怎么样?
前言这个问题是这样产生的?某天,在学习异步的知识遇到这样一道题:使用Promise的方式,每隔一秒输出数组中一个值const arr [1, 2, 3] arr.reduce((pre, cur) > {return pre.then(() > {returnnewPromise((resolve, rejec…...
Qt QMessageBox详解
文章目录一.QMessageBox介绍枚举属性函数二.QMessageBox的用法1.导入QMessage库2.弹窗提示3.提供选项的弹窗提示4.作为提示,报警,报错提示窗口一.QMessageBox介绍 文本消息显示框(message box)向用户发出情况警报信息并进一步解释警报或向用户提问&…...
Flutter之beamer路由入门指南
beamer路由入门指南 前言使用方法1、路由配置方式1路由配置方式2路由跳转测试现象前言 Beamer是一个很好用的路由组件,本文以beamer1.5.0版本进行说明,前面博主也介绍了其他路由组件 Flutter实战之go_router路由组件入门指南 、 Flutter之Fluro路由组件入门指南 Flutter之Ge…...
「基础篇」机器学习概览
文章目录1. 什么是机器学习2. 引入机器学习3. 应用场景4. 机器学习分类4.1. 有无人类监督4.2. 是否增量学习4.3. 泛化方式5. 主要挑战6. 测试与验证1. 什么是机器学习 机器学习(Machine Learning,ML)是一个研究领域,让计算机无需…...
揭秘可视化图探索工具 NebulaGraph Explore 是如何实现图计算的
前言 在可视化图探索工具 NebulaGraph Explorer 3.1.0 版本中加入了图计算工作流功能,针对 NebulaGraph 提供了图计算的能力,同时可以利用工作流的 nGQL 运行能力支持简单的数据读取,过滤及写入等数据处理功能。 本文将简单分享下 NebulaGr…...
移动架构43_什么是Jetpack
Android移动架构汇总 文章目录一 Android 开发框架演变1 MVC2 MVP3 MVVM二 什么是JetPack三 如何构建支持Jetpack项目一 Android 开发框架演变 1 MVC Model-View-Controller,模型-视图-控制器,Model负责数据管理,View负责UI显…...
TiDB的分布式事务原理探究
事务开启 获取全局授时作为startTS构建一个tikvTxn对象(包括snapshot)。 事务写 txn.Set方法本质上将kv值写入了一个内存缓存(即kv/memdb_buffer.go中的memDbBuffer)中。该内存kv数据库利用的是golevel提供的功能。 事务回滚 直接将tikvTxn的valid字段…...
【C语言】函数指针和指针函数
文章目录[TOC](文章目录)前言概述函数指针定义:使用:回调函数指针函数前言 今天学一下函数指针 提示:以下是本篇文章正文内容,下面案例可供参考 概述 函数指针:是一个指向函数的指针,在内存空间中存放的…...
Nodejs中npx简介和作用
一、npx简介npm从5.25.2版开始,增加了 npx 命令。方便了我在项目中使用全局包。二、安装Node安装后自带npm模块,可以直接使用npx命令。如果不能使用用,就要手动安装一下。npm install -g npx三、使用npx想要解决的主要问题,就是调…...
Matplotlib精品学习笔记001——绘制3D图形详解+实例讲解
3D图片更生动,或许在时间序列数据的展示上更胜一筹 想法: 学习3D绘图的想法来自科研绘图中。我从事的专业是古植物学,也就是和植物化石打交道。化石有三大信息:1.物种信息,也就是它的分类学价值;2.时间信息…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
