前言
项目中版本发布需要做一个版本管理工具,项目使用 SpringBoot 框架。
目前有两款 liquibase 和 flyway。
flyway不支持并发,也就是集群项目会执行多次,进而否掉。
Liquibase :
- 支持执行锁、回滚;
 
- 支持
MySQL, PostgreSQL, Oracle, Sql Server等; 
- 支持多开发者(每个脚本必须写 
author ); 
- 多种运行方式:命令行、
Spring集成、Maven插件等 
官网
Liquibase文件结构:
1 2 3 4 5 6 7 8 9 10
   | databaseChangeLog ├── createTable  |    ├── column |    ├── ... |    └── remarks  ├── createView |    ├── ... |    └── viewName  ├── ... └── sqlFile 
   | 
 
Liquibase使用
Maven引入
1 2 3 4 5 6
   |  <dependency>     <groupId>org.liquibase</groupId>     <artifactId>liquibase-core</artifactId>     <version>4.6.0</version> </dependency>
 
  | 
 
配置
application.yml 文件配置
1 2 3 4 5 6 7 8 9 10 11 12
   | spring:   liquibase:          enabled: true          change-log: classpath:/liquibase/change_log/Init_table.xml          drop-first: false          database-change-log-table: DATABASECHANGELOG          database-change-log-lock-table: DATABASECHANGELOGLOCK
   | 
 
Init_table.xml 文件配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
   | <?xml version="1.0" encoding="UTF-8"?> <databaseChangeLog         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xmlns="http://www.liquibase.org/xml/ns/dbchangelog"         xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">     <changeSet id="V0.0.1-20211017-001" author="maxzhao">         <createTable tableName="a_demo_user" remarks="用户表">             <column name="id" type="bigint" remarks="用户主键">                 <constraints nullable="false" primaryKey="true" primaryKeyName="pk_a_demo_user_id"/>             </column>             <column name="username" type="varchar(100)" remarks="用户名">                 <constraints nullable="false"/>             </column>             <column name="password" type="varchar(100)" remarks="密码">                 <constraints nullable="false"/>             </column>         </createTable>     </changeSet>                               </databaseChangeLog>
   | 
 
注意:
ID是唯一的,是存储数据库中判断 ChangeSet 是否执行的重要依据 
SQL 脚本文件不应该包含 schema 名称 
- 表、字段需要添加 
remarks 注释 
- 已经执行的 
changeSet 禁止修改,启动会报错。 
- 不要随便升级版本,特别是大版本。不同版本的 
CHangeSet MD5SUM 算法很可能不一样。 
- 不要添加业务数据的修改,可能换个项目就不能用了。
 
生成已存在表结构
1 2 3 4
   | # 生成表结构 liquibase --driver=com.mysql.cj.jdbc.Driver --classpath=mysql-connector-java-8.0.26.jar --changeLogFile=./dbchangelog.xml --url="jdbc:mysql://localhost:3306/blog" --username=root --password=root generateChangeLog # 生成表数据 liquibase --driver=com.mysql.cj.jdbc.Driver --classpath=mysql-connector-java-8.0.26.jar --changeLogFile=./dbchangelog.xml --url="jdbc:mysql://localhost:3306/blog" --username=root --password=root --diffTypes=data generateChangeLog
   | 
 
本文地址: https://github.com/maxzhao-it/blog/post/cf860b21/