我目前在 Spring 应用程序中使用 Liquibase 版本 4.29,我想以编程方式而不是通过命令行运行 Liquibase 更新。我已使用属性 liquibase.enabled=true 启用了 Liquibase,虽然在启动应用程序时迁移脚本成功运行,但我遇到了回滚问题。
当我使用 Liquibase 命令行界面 (CLI) 运行迁移,然后使用 liquibase rollback 执行回滚时,它按预期工作。但是,当我看到 Liquibase 在启动 Spring 应用程序时运行脚本时,回滚并未按预期工作;它返回“0 个更改已回滚。”
我注意到 liquibase.update() 方法已被弃用。该文档建议使用以下方法:
java.sql.Connection connection = openConnection(); // Your openConnection logic here
Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection));
Liquibase liquibase = new Liquibase("path/to/changelog.xml", new ClassLoaderResourceAccessor(), database);
liquibase.update(new Contexts(), new LabelExpression());
考虑到 update() 已被弃用,以编程方式执行 Liquibase 更新的推荐方法是什么,同时确保: Liquibase 成功迁移脚本,否则如果迁移失败,Spring 应用程序将无法启动。 回滚可以正常工作,与 CLI 类似。 任何指导或示例将不胜感激!
尝试使用此依赖项:
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
<version>4.23.0</version>
</dependency>
然后是这个:
@Autowired
private DataSource dataSource;
public void rollbackToTag(String tag) throws Exception {
try (Connection connection = dataSource.getConnection()) {
Database database = DatabaseFactory.getInstance()
.findCorrectDatabaseImplementation(
new JdbcConnection(connection));
Liquibase liquibase = new Liquibase("db/changelog/db.changelog-master.xml",
new ClassLoaderResourceAccessor(),
database);
liquibase.rollback(tag, "");
}
}