如何使用类路径使用Liquibase回滚数据库更改

时间:2015-07-22 13:21:27

标签: java spring liquibase

我的应用程序正在使用Liquibase来管理数据库更改。它像这样设置Liquibase:

@Bean(name = "liquibase")
public SpringLiquibase liquibaseData() {
    final SpringLiquibase liquibase = new SpringLiquibase();
    liquibase.setDataSource(dataSource);
    liquibase.setChangeLog("classpath:/db/changelog/db.changelog-master.xml");
    return liquibase;
}

目前只有一个变更集。通过运行应用程序应用变更集时,会按{4}}的DATABASECHANGELOG <{1}}将FILENAME中的记录插入classpath:/db/changelog/0.0.1/db.changelog.xml

当我执行liquibase rollbackCount 1时,响应为Liquibase Rollback Successful,但更改未回滚。

手动回滚更改(删除变更集创建的表)后,我执行liquibase update。更新成功,但FILENAMEdb/changelog/0.0.1/db.changelog.xml。我执行liquibase rollbackCount 1,并按预期回滚更改。

这是我的liquibase.properties

driver: oracle.jdbc.driver.OracleDriver
classpath: ../../../../../client-ui/build/libs/client-ui.war
url: jdbc:oracle:thin:@localhost:1521/orcl
username: the-username
password: the-password
changeLogFile: classpath:/db/changelog/db.changelog-master.xml

问题的症结似乎是当应用程序对命令行应用变更集时FILENAME不同。如何配置命令行参数,以便创建与应用程序创建的DATABASECHANGELOG相同的FILENAME记录?

1 个答案:

答案 0 :(得分:2)

是的,问题是FILENAME是不同的。 Spring有时包含类路径:在他们的URL中,Liquibase只使用它。 Liquibase中有代码试图处理“有时有classpath:”前缀,但听起来在回滚逻辑中没有正确处理。

在最新版本中如何处理类路径前缀有一些改进,你试过使用Liquibase 3.4.0吗?

否则,通过spring的Liquibase更新应该可以正常工作,有或没有classpath前缀,所以如果你修复FILENAME字段你应该是好的。如果你使用的是mysql,那就像UPDATE DATABASECHANGELOG SET FILENAME = SUBSTR(FILENAME, 10) WHERE FILENAME LIKE 'classpath:%'。您可以在更改日志文件的底部放置一个runAlways = true changeSet,以使其自动清理每次更新时的路径。