首页 > 编程语言 > 详细

Idea Spring-boot maven下使用liquibase

时间:2021-01-18 20:01:18      阅读:17      评论:0      收藏:0      [点我收藏+]

 官方文档

 https://docs.liquibase.com/tools-integrations/maven/home.html

 通过liquibase使用mysql

 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命令生成现有数据库快照

 生成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

 通过liquibase update命令使用changeLogFile文件更新数据库

 修改changeLog的路径

 技术分享图片

 技术分享图片

 然后可以在changelog中建表 

  •  将changeset添加到变更日志。
  •  changeset由author和id属性唯一标识。
  •  Liquibase尝试执行事务中在最后提交的每个changeset。

 在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

 技术分享图片

 至此,更新数据库功能完好

 DatabaseChangeLog 和 DatabaseChangeLogLock

 技术分享图片

 我们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

(0)
(0)
   
举报
评论 一句话评论(0
© 2014 bubuko.com 版权所有 鲁ICP备09046678号-4
打开技术之扣,分享程序人生!
             

鲁公网安备 37021202000002号