liquibase是一个数据库变更的版本控制,重构和迁移的开源工具。项目中通过liquibase日志文件的形式解析通过记录数据库的变更,生成sql语句,并执行和记录,将数据库更新或回滚到一致的状态。执行是根据记录确定sql语句是否曾经执行过,和配置文件里的预判断语句确定sql是否执行。
它的目标是提供一种数据库类型无关的解决方案,通过执行schema类型的文件来达到迁移。其优点主要有以下:
本文引入maven依赖,规定版本4.9.1
官网:Liquibase | Open Source Version Control for Your Database
技术文档:Liquibase Online Documentation
最新版本:4.16.0
更新时间2022.09.09
<dependency>
<groupId>org.liquibasegroupId>
<artifactId>liquibase-coreartifactId>
<version>4.9.1version>
dependency>
文件层级:
配置文件:
spring:
datasource:
# MySql
url: jdbc:mysql://localhost:33066/bladex_boot?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
username: root
password: 4Pt2lUUScy
liquibase:
enabled: true
# 如下配置是被spring.datasource赋值的,所以可以不配置
# url: jdbc:mysql://localhost:3306/test_db_liquibase?useSSL=false&autoReconnect=true&characterEncoding=utf8
# user: root
# password: bfXa4Pt2lUUScy8jakXf
change-log: classpath:/db/changelog/db.changelog-master.yaml
- createTable
方式创建数据表通过- createTable
属性创建数据表,表中每个字段通过- column
属性添加字段,其- column
字段各属性如下贴图所示 。
databaseChangeLog:
- changeSet:
id: 20221012-01
author: chuci
changes:
- createTable:
catalogName: bladex_boot
tableName: test-table
remarks: 测试数据表
schemaName: public
tablespace: 测试tablespace
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: firstname
type: varchar(50)
remarks: 姓氏
- column:
name: lastname
type: varchar(50)
remarks: 名字
constraints:
nullable: false
- column:
name: state
type: char(2)
- column:
name: create_time
type: datetime
字段column属性:column | Liquibase Docs
sqlFile
方式创建数据表使用 - sqlFile
属性,通过读取.sql文件来执行SQL语句创建数据库sqlFile | Liquibase Docs
databaseChangeLog:
- changeSet:
id: 20221013-01
author: chuci-sqlFile
changes:
- sqlFile:
# 指定数据库类型,使用 ‘,’进行分割
dbms: '!h2,oracle,mysql'
# 指定在属性中定义的文件中使用的编码
encoding: UTF-8
# 指定结束 SQL 语句的字符。
endDelimiter: ;
# Set to false to not have Liquibase split statements on and . Defaults to true if not set.
splitStatements: true
# 指示文件路径是否相对于更改日志文件,而不是在搜索路径中查找。
relativeToChangelogFile: true
# 指定要加载的 SQL 文件的文件路径。
path: ../sql/wyTestCreateNameTable.sql
# 设置relativeToChangelogFile: false 时候指定从绝对路径
# path: classpath:/db/sql/wyTestCreateNameTable.sql
# 设置为 在执行之前删除 SQL 中的任何注释。
stripComments: true
CREATE TABLE `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`firstname` varchar(50) DEFAULT NULL COMMENT '姓氏',
`lastname` varchar(50) DEFAULT NULL COMMENT '名字',
`state` char(2) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试数据表';
不仅仅是createTable
, 还包括其他
不仅仅可以读取.sql
文件来执行SQL语句,同时也支持直接执行SQL语句:sql | Liquibase Docs
databaseChangeLog:
- changeSet:
id: sql-example
author: liquibase-docs
changes:
- sql:
dbms: '!h2,oracle,mysql'
endDelimiter: \nGO
splitStatements: true
sql: INSERT INTO `bladex_boot`.`wy-test2` (`firstname`, `lastname`, `state`, `create_time`) VALUES ('first', 'last', '1', '2022-10-13 15:40:10');
stripComments: true
comment: What about Bob?
最后的最后~,操作异常也可以通过rollback来进行回滚。
最后附上完整测试yaml文件
databaseChangeLog:
- changeSet:
id: 20221012-01
author: chuci
changes:
- createTable:
catalogName: bladex_boot
tableName: wy-test2
remarks: 测试数据表
schemaName: public
tablespace: 测试tablespace
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: firstname
type: varchar(50)
remarks: 姓氏
- column:
name: lastname
type: varchar(50)
remarks: 名字
constraints:
nullable: false
- column:
name: state
type: char(2)
- column:
name: create_time
type: datetime
- changeSet:
id: 20221012-02
author: chuci
changes:
- addLookupTable:
existingTableName: wy-test2
existingColumnName: state
newTableName: state-test
newColumnName: id
newColumnDataType: char(2)
- changeSet:
id: 20221013-01
author: chuci-sqlFile
changes:
- sqlFile:
# 指定数据库类型,使用 ‘,’进行分割
dbms: '!h2,oracle,mysql'
# 指定在属性中定义的文件中使用的编码
encoding: UTF-8
# 指定结束 SQL 语句的字符。
endDelimiter: ;
# Set to false to not have Liquibase split statements on and . Defaults to true if not set.
splitStatements: true
# 指示文件路径是否相对于更改日志文件,而不是在搜索路径中查找。
relativeToChangelogFile: true
# 指定要加载的 SQL 文件的文件路径。
path: ../sql/wyTestCreateNameTable.sql
# 设置为 在执行之前删除 SQL 中的任何注释。
stripComments: true
- changeSet:
id: 20221013-04
author: chuci-sqlFile
changes:
- sqlFile:
# 指定数据库类型,使用 ‘,’进行分割
dbms: '!h2,oracle,mysql'
# 指定在属性中定义的文件中使用的编码
encoding: UTF-8
# 指定结束 SQL 语句的字符。
endDelimiter: ;
# Set to false to not have Liquibase split statements on and . Defaults to true if not set.
splitStatements: true
# 指示文件路径是否相对于更改日志文件,而不是在搜索路径中查找。
relativeToChangelogFile: false
# 指定要加载的 SQL 文件的文件路径。
path: classpath:/db/sql/wyTestCreateNameTable.sql
# 设置为 在执行之前删除 SQL 中的任何注释。
stripComments: true
- changeSet:
id: sql-example
author: liquibase-docs
changes:
- sql:
dbms: '!h2,oracle,mysql'
endDelimiter: \nGO
splitStatements: true
sql: INSERT INTO `bladex_boot`.`wy-test2` (`firstname`, `lastname`, `state`, `create_time`) VALUES ('first', 'last', '1', '2022-10-13 15:40:10');
stripComments: true
comment: What about Bob?
上一节:
下一节:
此系列以完整记录自己在 J a v a 学习路的过程 此系列以完整记录自己在Java学习路的过程 此系列以完整记录自己在Java学习路的过程