我的应用程序正在使用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
。更新成功,但FILENAME
为db/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
记录?
答案 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,以使其自动清理每次更新时的路径。