首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

springBoot生成SQL文件-基于Liquibase实现

之前的文章介绍的都是用的jpa或者Hibernate内部方法实现的,本文引入一个第三方数据库管理工具Liquibase,说到数据库版本管理软件还有Flyway,但其社区版无论是功能还是用法均简单至极,完全无法和Liquibase相比。

当项目中不使用Hibernate与jpa自动生成表时,完全可以用Liquibase管理SQL脚本的版本迭代,还可以对比数据库间的差异生成对应的差异log,其用来管理版本的log文件还可以与SQL脚本文件互转,具体强大到几何去其官网领教吧。

本文的目标是创建一个gradle的task来运行Liquibase生成增量脚本,这里需要引入其gradle插件liquibase-gradle-plugin。

目录

插件基本用法

这里仅做基础介绍,详情可见其README.md文档。

1.引入插件

要将插件包含到Gradle构建中,只需将以下内容添加到build.gradle文件中:

要使用较旧的Gradle 2.0样式(多模块项目好像必须用这种),请将以下内容添加到build.gradle中:

2.设置classpath

该插件在运行任务时需要能够在类路径上找到Liquibase,而Liquibase需要能够在类路径中找到数据库驱动程序,更改日志解析器等。

这是通过将liquibaseRuntime依赖项添加到build.gradle文件中的依赖项块来完成的。 至少,您需要包含Liquibase本身以及数据库驱动程序:

3.配置插件

Liquibase命令的参数在build.gradle文件内的liquibase块中配置。

该块包含一系列“activity”,每个activity定义一系列Liquibase参数。

“activity”中的任何方法都假定为Liquibase命令行参数。例如,在活动中包含 与 在命令行上执行的操作相同。在activity中包含 与 在命令行上执行的操作相同,等等.Liquibase文档详细说明了所有有效的命令行参数。

liquibase块还有一个可选的“runList”,它确定为每个任务运行哪些活动。如果没有定义runList,Liquibase插件将运行所有活动。注意:不保证没有runList时的执行顺序。

多模块项目中生成增量脚本

目标将生成增量脚本的task单独抽成一个liquibase.gradle文件,在build.gradle中引入。本方案是通过对比两个数据库生成增量脚本。

1.设置build.gradle

buildscript中dependencies包含插件:

不然会报如下错误,原本想只在liquibase.gradle中引入,但发现在liquibase.gradle中无效:

configure(rootProject)中引入插件:

2.创建liquibase.gradle

具体文件如下:

3.配置application.properties

由上面配置可知,这里将liquibase的配置属性都集中在了application.properties文件中,故在application.properties文件中配置参考的标准数据库信息,如:

若想自定义参照数据库的驱动类名可添加使用 属性字段,反之默认使用 字段。

文件中已默认添加MySQL和Oracle的运行时驱动,若无法满足需求可自行修改为所需版本:

默认在 目录下生成diff后的changelog文件 ,如changelog-master-20181217172416.yaml。该文件用于之后生成SQL增量脚本。

默认在 目录下生成SQL增量脚本 。

4.使用方法

执行 即可生成所需要的增量SQL脚本文件。

该脚本仅涉及表结构,执行涉及到的DROP的语句前,请确保该语句不是因重命名字段等产生的。

单模块项目中生成增量脚本

单模块可以如上面多模块生成方式一样对比两个数据库,也可以对比数据库与当前程序中的注解entity生成增量脚本。原因是单模块下可以直接通过配置 依赖,将entity的classpath注入给liquibase,若多模块下有大神能找到方案,也可以使用这种方案从而免去建参照库。

这里仅介绍对比数据库与当前程序中的注解entity生成增量脚本的方案,该方案需要用到liquibase-hibernate以及一大批jpa相关的依赖,具体完整文件如下:

使用

该方案参考资料:

1.Unable to perform diff with Spring Boot #44

2.完整demo:spring-liquibase

liquibase插件内置任务

多模块项目的解决方案下liquibase.gradle文件的doLast中的diffChangeLog和updateSQL均属于liquibase插件中的内置任务。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181227G1HL4E00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券