如何在Gradle任务中配置Liquibase执行SQL文件操作Docker内的MySQL
基于Liquibase + Gradle 实现Docker MySQL自动执行SQL的配置步骤
1. 引入Liquibase Gradle插件
首先在项目根目录的build.gradle文件中添加插件声明和依赖:
plugins { id 'java' // 引入Liquibase Gradle插件,版本可根据需要调整 id 'org.liquibase.gradle' version '2.2.0' } dependencies { // 引入MySQL JDBC驱动,版本和你Docker中运行的MySQL大版本匹配即可 liquibaseRuntime 'mysql:mysql-connector-java:8.0.33' liquibaseRuntime 'org.liquibase:liquibase-core:4.20.0' }
2. 调整项目结构存放SQL文件
在src/main目录下新建liquibase文件夹,结构如下:
- src/main/liquibase/
- changelog.xml (Liquibase变更日志主文件)
- sql/ (存放你的SQL脚本,比如你现有的file.sql就放这里)
3. 编写Liquibase变更日志配置
在src/main/liquibase/changelog.xml中添加如下内容,关联你要执行的SQL文件:
<?xml version="1.0" encoding="UTF-8"?> <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-4.20.xsd"> <!-- 配置要执行的SQL文件,id可以自定义,author填你的名字即可,alwaysRun设为true每次执行任务都会跑这个SQL,不需要的话可以改成false --> <changeSet id="init-sql-1" author="dev" runAlways="true"> <sqlFile path="sql/file.sql" relativeToChangelogFile="true" splitStatements="true" endDelimiter=";"/> </changeSet> </databaseChangeLog>
如果你有多份SQL要按顺序执行,新增多个
<changeSet>标签按顺序写即可,Liquibase会自动记录已执行的变更,重复执行不会重复跑已经成功执行过的变更(除非你设置了runAlways="true")
4. 配置Liquibase Gradle任务参数
在build.gradle中添加Liquibase活动配置,关联你的Docker MySQL连接信息:
liquibase { activities { main { // Docker MySQL的连接地址,注意端口是你容器映射到宿主机的端口 url 'jdbc:mysql://localhost:3306/你的数据库名?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8' username '你的MySQL用户名' password '你的MySQL密码' driver 'com.mysql.cj.jdbc.Driver' changelogFile 'src/main/liquibase/changelog.xml' } } }
如果不想把账号密码硬编码在配置文件里,可以通过环境变量读取,改成
username System.getenv("MYSQL_USER")、password System.getenv("MYSQL_PWD")即可
5. 执行任务验证
首先确保你的Docker MySQL容器已经启动,且端口已经映射到宿主机,然后在项目根目录执行以下Gradle命令即可触发SQL执行:
./gradlew update
你也可以自定义Gradle任务绑定这个操作,比如把Liquibase的update任务绑定到build流程里,每次构建自动执行。
注意事项
- 要确保你的Docker MySQL容器的3306端口已经映射到宿主机,否则Gradle跑的Liquibase无法连接到数据库
- 如果你的SQL里有建库语句,可以把url里的数据库名去掉,直接连MySQL服务实例即可
- Liquibase会自动在你的数据库里生成2张表
DATABASECHANGELOG和DATABASECHANGELOGLOCK用来记录变更执行情况,属于正常现象,不需要删除
内容的提问来源于stack exchange,提问作者ExplainSpringMagicToMePls
相关产品推荐
相关产品推荐

