【发布时间】:2020-09-14 17:15:20
【问题描述】:
Maven 依赖项;
Spring Boot 版本:2.2.3.RELEASE
Liquibase 核心版本:3.8.5
Postgresql 版本:42.2.9
我有一个针对 PostgreSQL 11 数据库运行的 Spring Boot 应用程序,该应用程序呈现出以前没有注意到的新行为。当我运行更新命令时,即使正在创建 databasechangeloglock 表,也不会在我的活动模式中创建 databasechangelog 表。这当然会导致运行失败,因为关系不存在。然而;我不控制此表的创建,也从未控制过它。以前的表就像锁表一样自动创建,但现在不是了。
以下是我如何设置数据库和 Liquibase 的 2 个主要对象以供更新命令使用。
private void setDatabase() {
if (hasConn) {
try {
database = (Database) Class.forName("liquibase.database.core.PostgresDatabase").newInstance();
database.setConnection(new JdbcConnection(getConnection()));
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
log.error("Could not return Liquibase Database Object");
log.error(e.getMessage());
}
} else {
log.warn("Connection Object not yet set!");
}
}
private void melt() {
this.liquibase = new Liquibase(getDatabaseChangeLog(), new ClassLoaderResourceAccessor(), getDatabase());
}
private void drinkUpdate() throws LiquibaseException {
this.liquibase.update((String) null);
}
我最近将此应用程序更改为多模块 Maven 项目的一部分,该项目根据新的父 POM 更改了我正在使用的所有版本引用。
我的问题是,是否有人以前见过这种行为,以及它是否与处理时使用的 jar 版本有关?为什么更新运行时会生成databasechangeloglock 表而不是databasechangelog 表?还;看来databasechangelog 表在我的公共架构中生成对于我生成的每个数据库来说都很好......只是不在我的自定义架构对象中,它包含我的大部分数据库对象。
我查看了调试输出,发现我的 liquibase.Liquibase 对象和相应的 liquibase.database.Database 对象是完整且准确的,并使用适当命名的 databasechangelog 和 databasechangeloglock 表指定了当前架构设置为我的值但是更改日志表拒绝在锁定表生成的同时生成。不幸的是,只要我手动创建 databasechangelog 表,数据库更改日志中指定的其余对象就会按预期创建。
【问题讨论】:
标签: java postgresql spring-boot liquibase