一: 自動執行回滾, 已執行成功的忽略,新sql執行失敗則執行新sql文件中的回滾sql
pom.xml?
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>4.25.0</version>
</dependency>
sql 文件指定回滾sql
新建一個?CustomChangeExecListener 繼承?AbstractChangeExecListener?
@Service
@Slf4j
public class CustomChangeExecListener extends AbstractChangeExecListener {@SneakyThrowspublic void runFailed(ChangeSet changeSet, DatabaseChangeLog databaseChangeLog, Database database, Exception exception) {log.error("sql執行失敗, 執行回滾sql, 錯誤原因: {}", exception.getMessage());String line = "\r\n";String jdbc = "jdbc";List<String> sqlList = new ArrayList<>();changeSet.getRollback().getChanges().stream().forEach(e->{RawSQLChange rawSQLChange = (RawSQLChange) e;Arrays.asList(rawSQLChange.getSql().split(line)).stream().forEach(sql->{sqlList.add(sql);});});if(CollectionUtils.isEmpty(sqlList)){return;}Executor executor = Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor(jdbc, database);for (String sql : sqlList){executor.execute(new RawSqlStatement(sql));}}}
啟動參數加上:
-Dliquibase.command.changeExecListenerClass=com.tang.execListener.CustomChangeExecListener
2??: 自動打tag, 注意如果有上面的自動執行回滾sql, 這一步不是很重要
spring.liquibase.tag 不起作用, 搞個自動打tag
1: github 拉取源碼
地址:GitHub - liquibase/liquibase: Main Liquibase Source
2: idea 打開如下路徑:
liquibase/sqlgenerator/core/MarkChangeSetRanGenerator.java?
加入如下代碼:
if(change instanceof RawSQLChange){tag = changeSet.getId();}
?
把編譯的class 替換jar路徑中的class放到倉庫
sql文件中加入標記如下: 作者:id
加入上面的代碼,tag會拿這個id 作為tag標簽。
執行結果: