Gradle配置Liquibase数据库迁移任务执行成功但表结构未变更问题求助
问题原因
- 核心问题:自定义
dbmigrate任务仅完成了Liquibase活动参数配置,没有调用Liquibase的实际迁移执行命令。Liquibase Gradle插件的迁移逻辑是由内置的update等任务提供的,仅配置参数不触发执行动作,自然不会执行数据库变更。 - 隐性错误:
schema2的changeLogFile使用单引号包裹变量$projectDir,Groovy中单引号不会插值解析变量,路径会变成字面量$projectDir/src/main/...,后续即使触发执行也会找不到changelog文件。 - 补充排查点:如果changelog文件本身语法错误、变更集已经标记为执行过(DATABASECHANGELOG表存在对应执行记录),也会出现无变更的情况,当前场景优先解决执行逻辑缺失问题即可。
修复方案
推荐直接使用Liquibase插件内置任务,无需自定义任务,配置更规范,修改后代码如下:
buildscript { repositories { mavenCentral() } dependencies { classpath 'org.liquibase:liquibase-core:4.4.3' classpath "org.liquibase:liquibase-gradle-plugin:2.0.4" classpath 'mysql:mysql-connector-java:5.1.13' } } plugins { id 'java' id 'org.liquibase.gradle' version '2.0.4' } // 全局配置liquibase参数 liquibase { activities { schema1 { changeLogFile "$projectDir/src/main/resources/db/migrations.xml" url 'jdbc:mysql://localhost:3306/bmw?zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8&serverTimezone=UTC' username 'root' password 'root' driver 'com.mysql.jdbc.Driver' } schema2 { // 改为双引号支持变量插值 changeLogFile "$projectDir/src/main/resources/db/migrations.xml" url 'jdbc:mysql://localhost:3306/vw?zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8&serverTimezone=UTC' username 'root' password 'root' driver 'com.mysql.jdbc.Driver' } } runList = 'schema1, schema2' } // 让build依赖插件内置的update迁移任务 build.dependsOn update
修改后执行gradlew build或gradlew update即可触发数据库迁移生效。
如果需要保留自定义dbmigrate任务,只需在配置完Liquibase参数后新增执行内置update任务的逻辑即可:
task dbmigrate { doLast { println "executing dev" liquibase { activities { schema1 { changeLogFile "$projectDir/src/main/resources/db/migrations.xml" url 'jdbc:mysql://localhost:3306/bmw?zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8&serverTimezone=UTC' username 'root' password 'root' driver 'com.mysql.jdbc.Driver' } schema2 { changeLogFile "$projectDir/src/main/resources/db/migrations.xml" url 'jdbc:mysql://localhost:3306/vw?zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8&serverTimezone=UTC' username 'root' password 'root' driver 'com.mysql.jdbc.Driver' } } runList = 'schema1, schema2' } // 新增此行主动触发迁移执行 project.tasks.update.execute() } } build.dependsOn dbmigrate
内容的提问来源于stack exchange,提问作者Laodao
相关产品推荐
相关产品推荐

