Liquibase 和 Flyway 是两款成熟的、优秀的、开源/商业版的数据库版本管理工具,鉴于 Flyway 的社区版本对 Oracle 数据库支持存在限制,所以 boot-admin 选择整合 Liquibase 提供数据库版本管理能力支持。
Liquibase 开源版使用 Apache 2.0 协议。
boot-admin 是一款采用前后端分离模式、基于 SpringCloud 微服务架构的SaaS后台管理框架。系统内置基础管理、权限管理、运行管理、定义管理、代码生成器和办公管理6个功能模块,集成分布式事务 Seata、工作流引擎 Flowable、业务规则引擎 Drools、后台作业调度框架 Quartz 等,技术栈包括 Mybatis-plus、Redis、Nacos、Seata、Flowable、Drools、Quartz、SpringCloud、Springboot Admin Gateway、Liquibase、jwt、Openfeign、I18n等。
项目源码仓库github
项目源码仓库gitee
<dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> </dependency>
spring: liquibase: enabled: true change-log: classpath:liquibase/master.xml
在 resources 下创建文件夹 liquibase ,创建文件 master.xml
<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-3.1.xsd"> <includeAll path="liquibase/changelogs/" relativeToChangelogFile="false"/> </databaseChangeLog>
在 liquibase 文件夹下创建 changelogs 和 sql 两个文件夹,如下图所示:
在 resources\liquibase\changelogs 下创建 changeSet 文件,推荐每月一个 xml 文件,文件名格式:【changelog-年度+月份.xml】,如:changelog-202304.xml
常用操作举例:
<changeSet author="admin (generated)" id="00001-9"> <createTable remarks="行政区划表" tableName="TB_ADM_DIV"> <column name="GUID" remarks="主键" type="NVARCHAR2(38)"> <constraints nullable="false" primaryKey="true" primaryKeyName="PK_TB_ADM_DIV"/> </column> <column name="ADM_DIV_CODE" remarks="行政区划代码" type="NVARCHAR2(12)"> <constraints nullable="false"/> </column> <column name="ADM_DIV_NAME" remarks="行政区划名称" type="NVARCHAR2(100)"> <constraints nullable="false"/> </column> <column name="CREATE_BY" remarks="记录创建者" type="NVARCHAR2(100)"> <constraints nullable="false"/> </column> <column name="CREATE_TIME" remarks="记录创建时间" type="${type.datetime}"> <constraints nullable="false"/> </column> <column name="MODIFY_BY" remarks="记录最后修改者" type="NVARCHAR2(100)"> <constraints nullable="false"/> </column> <column name="MODIFY_TIME" remarks="记录最后修改时间" type="${type.datetime}"> <constraints nullable="false"/> </column> <column defaultValueComputed="${now}" name="DATESTAMP" remarks="时间戳" type="${type.datetime}"> <constraints nullable="false"/> </column> <column name="ENABLED" remarks="启用状态;ENABLED" type="NVARCHAR2(1)"> <constraints nullable="false"/> </column> <column name="DELETED" remarks="删除状态;DELETED" type="NVARCHAR2(1)"> <constraints nullable="false"/> </column> <column name="VERSION" remarks="乐观锁" type="${type.int}"> <constraints nullable="false"/> </column> <column name="REMARKS" remarks="备注" type="NVARCHAR2(900)"/> <column name="TENANT_ID_" remarks="租户ID" type="NVARCHAR2(38)"> <constraints nullable="false"/> </column> <column name="PARENT_GUID" remarks="父级GUID" type="NVARCHAR2(38)"> <constraints nullable="false"/> </column> <column name="LEAF" remarks="是否末级;YESNO" type="NVARCHAR2(1)"> <constraints nullable="false"/> </column> <column name="SORT" remarks="顺序号" type="${type.int}"> <constraints nullable="false"/> </column> </createTable> </changeSet>
<changeSet author="admin" id="00002-1"> <addColumn tableName="TB_ADM_DIV"> <column name="EXT" remarks="扩展" type="VARCHAR(64)"/> </addColumn> </changeSet>
<changeSet author="admin" id="00002-2"> <dropColumn tableName="TB_ADM_DIV" columnName="EXT"/> </changeSet>
<changeSet author="admin" id="00002-3"> <setColumnRemarks tableName="TB_ADM_DIV" columnName="EXT" remarks="扩展字段"/> </changeSet>
<changeSet author="admin" id="00002-4"> <modifyDataType tableName="TB_ADM_DIV" columnName="EXT" newDataType="VARCHAR2(2000)"/> </changeSet>
<changeSet author="admin (generated)" id="00001-1" dbms="oracle"> <createView fullDefinition="true" remarks="表和视图" viewName="V_TABLES_MASTER"> CREATE OR REPLACE FORCE VIEW V_TABLES_MASTER (TABLE_SCHEMA, TABLENAME, TABLETYPE, COMMENTS, TENANT_ID_) AS select SYS_CONTEXT('USERENV','CURRENT_SCHEMA') TABLE_SCHEMA, t.tname tableName, tabtype tabletype, f.comments comments, 'DEMO' TENANT_ID_ from tab t inner join user_tab_comments f on t.tname = f.table_name where tname != 'DATABASECHANGELOG' and tname != 'DATABASECHANGELOGLOCK' and tname != 'UNDO_LOG' </createView> </changeSet> <changeSet author="37514 (generated)" id="00000-2" dbms="mysql"> <createView fullDefinition="true" remarks="表和视图" viewName="V_TABLES_MASTER"> CREATE OR REPLACE VIEW V_TABLES_MASTER AS SELECT TABLE_SCHEMA, TABLE_NAME AS TABLENAME, case when table_type='BASE TABLE' then 'TABLE' ELSE table_type END AS TABLETYPE, TABLE_COMMENT AS COMMENTS, 'DEMO' TENANT_ID_ FROM information_schema.`TABLES` WHERE table_name != 'databasechangeloglock' AND TABLE_NAME != 'databasechangelog' AND TABLE_NAME != 'undo_log' </createView> </changeSet>
<property name="type.datetime" value="date" dbms="oracle"/> <property name="type.datetime" value="timestamp" dbms="mysql"/> <property name="type.int" value="NUMBER(*, 0)" dbms="oracle"/> <property name="type.int" value="INT" dbms="mysql"/> <property name="type.decimal" value="NUMBER(*, 2)" dbms="oracle"/> <property name="type.decimal" value="DECIMAL" dbms="mysql"/> <property name="now" value="SYSDATE" dbms="oracle"/> <property name="now" value="now()" dbms="mysql,h2"/> <property name="autoIncrement" value="true" dbms="mysql,h2,postgresql,oracle"/> <property name="amount" value="decimal(20,2)"/> <property name="uuid" value="sys_guid()" dbms="oracle"/> <property name="uuid" value="UUID()" dbms="mysql"/>
<changeSet id="20000820-003" author="Administrator" dbms="oracle"> <sqlFile dbms="oracle" path="classpath:/liquibase/sql/seata-undo_log-oracle.sql" /> </changeSet> <changeSet id="20000820-003" author="Administrator" dbms="mysql"> <sqlFile dbms="mysql" path="classpath:/liquibase/sql/seata-undo_log-mysql.sql" /> </changeSet>
需将对应 sql 文件放在指定文件夹中。
标签 | 描述 |
---|---|
addAutoIncrement | 将一个已存在的列转换为自增 |
addColunm | 增加列 |
addDefaultValue | 对已存在的列增加默认值 |
addForeignKeyConstraint | 对已存在的列增加外键约束 |
addLookupTable | 创建外键关联的表 |
addNotNullConstraint | 对已存在的列增加非空约束 |
addPrimaryKey | 对已存在的列增加主键约束 |
ddUniqueConstraint | 对已存在的列增加主键约束 |
标签 | 描述 |
---|---|
createIndex | 创建索引 |
createProcedure | 创建存储过程 |
createSequence | 创建序列 |
createTable | 创建表 |
createView | 创建视图 |
标签 | 描述 |
---|---|
dropAllForeignKeyConstraints | 删除全部的外键约束 |
dropColumn | 删除列 |
dropDefaultValue | 删除默认值设置 |
dropForeignKeyConstraint | 删除某一列的外键约束 |
dropNotNullConstraint | 删除非空约束 |
dropIndex | 删除索引 |
dropSequence | 删除约束 |
dropProcedure | 删除存储过程 |
dropPrimaryKey | 删除主键 |
dropTable | 删除表 |
dropUniqueConstraint | 删除唯一性约束 |
dropView | 删除视图 |
标签 | 描述 |
---|---|
renameColumn | 重命名列 |
renameSequence | 重命名序列 |
renameTable | 重命名表 |
renameView | 重命名视图 |
标签 | 描述 |
---|---|
sql | 原生SQL |
sqlFile | 引入 SQL 文件 |
标签 | 描述 | 标签 | 描述 |
---|---|---|---|
alterSequence | 修改序列 | customChange | 自定义change类型,需要自己实现liquibase.change.custom.CustomSqlChange、liquibase.change.custom.CustomTaskChange接口 |
delete | 删除数据 | empty | 空操作 |
executeCommand | 执行系统命令,如 mysqldump | insert | 插入数据 |
loadData | 加载 csv 文件到已存在的表中 | loadUpdateData | 加载 csv 文件到已存在的表中,但是会判断是否存在,存在更新,否则新增 |
mergeColumns | 将两列值合并在一起,存入新列中 | modifyDataType | 修改列数据类型 |
output | 记录一条消息并继续执行 | setColumnRemarks | 列上添加备注 |
setTableRemarks | 表上添加备注 | stop | 通过消息停止 Liquibase |
tagDatabase | 将标签应用于数据库以供将来回滚 | update | 更新数据 |