https://docs.liquibase.com/tools-integrations/maven/home.html
https://docs.liquibase.com/workflows/database-setup-tutorials/mysql.html?Highlight=mysql
在resources目录下新建一个文件 liquibase.properties
--driver=com.mysql.cj.jdbc.Driver --classpath=mysql-connector-java-8.0.22.jar --url="jdbc:mysql://bj-cdb-nivnaury.sql.tencentcdb.com:60991/lianmai?autoReconnect=true&useSSL=FALSE" --changeLogFile=db.changelog-1.0.xml --username=*****--password=*****
在此之前,我们需要先引入mysql连接器,注册mysql驱动
打开project structure,由于我这个项目已经在 pom.xml 文件中注入了mysql-connector的依赖,library和modules已经自动下载
引入mysql连接器
注册mysql驱动
liquibase.properties的配置类比如下
driver=com.mysql.cj.jdbc.Driver classpath=mysql-connector-java-8.0.22.jar url=jdbc:mysql://bj-cdb-nivnaury.sql.tencentcdb.com:*/lianmai?autoReconnect=true&useSSL=FALSE changeLogFile=src/main/resources/db/changelog/dbChangeLog.xml outputChangeLogFile=src/main/resources/db/changelog/outputChangeLog.xml username=* password=*
如果我们在一个已经有数据库和数据表的项目上使用 liquibase 数据迁移工具,那么可以通过changelog命令生成现有数据库快照
https://docs.liquibase.com/commands/community/generatechangelog.html?Highlight=generateChangeLog
首先要配置propertyFile属性,下面是我的目录结构以及propertyFile的属性配置
<plugin>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-maven-plugin</artifactId>
<configuration>
<propertyFile>src/main/resources/liquibase.properties</propertyFile>
</configuration>
</plugin>
然后需要在liquibase.properties中配置outputChangeLogFile属性
我们通过 excute maven goal 来执行 liquibase指令
点击上图图标后回车执行
刚开始url这块,冒号没有去掉,执行 mvn liquibase:generateChangeLog 指令出现了以下这种错误
国外有个老哥犯了同样的错误,https://stackoverflow.com/questions/49053509/ms-sql-liquibase-connection-could-not-be-created
然后outputChangeLogFile文件位置配置错误,执行指令出现了下面这种报错
然后修改文件路径,需要注意这个路径是从src开始的,不是从properties的当前目录开始的
正确的配置应该是
outputChangeLogFile=src/main/resources/db/changelog/outputChangeLog.xml
命令执行成功之后,会出现以下图像
然后弹框确认是否继续执行
最后文件中的结果如下所示
下图是数据库中的Persons表
如果我们要去修改这个数据库就需要用到changeLogFile
修改changeLog的路径
然后可以在changelog中建表
在dbchangelog.xml文件文件中,添加一个新的部门创建表变更集,如下所示
<changeSet id="1" author="bob"> <createTable tableName="department"> <column name="id" type="int"> <constraints primaryKey="true" nullable="false"/> </column> <column name="name" type="varchar(50)"> <constraints nullable="false"/> </column> <column name="active" type="boolean" defaultValueBoolean="true"/> </createTable> </changeSet>
生成的sql语句如下
CREATE TABLE "department" ("id" number (*,0), "name" VARCHAR2 (50 BYTE), "active" NUMBER (1, 0) DEFAULT 1 );
执行 mvn liquidbase:update 指令
我们去数据库看一下 create table
至此,更新数据库功能完好
我们show一下table DatabaseChangeLog
select一下,会发现这个表记录的是每次update的变更集以及用户和时间等相关信息,用来更新和回滚
再我们show一下table DatabaseChangeLogLock
看下官网
Liquibase使用DATABASECHANGELOGLOCK表来确保一次只运行一个Liquibase实例。
因为Liquibase只是从DATABASECHANGELOG表中读取数据以确定需要运行哪些变更集,所以如果对同一个数据库同时执行多个Liquibase实例,则会发生冲突。
如果多个开发人员使用同一个数据库实例,或者集群中有多个服务器在启动时自动运行Liquibase,则可能发生这种情况。
所以这个表是用来锁数据库的,避免多个开发人员同一时刻操作数据库的时候造成冲突
下图是四个字段的用途
id和locked好理解,lockgranted指的是锁库日期,lockedby指的是被谁锁定
等使用回滚的时候再整理下回滚功能
Idea Spring-boot maven下使用liquibase
原文:https://www.cnblogs.com/YC-L/p/14291077.html