java - 未在 Liquibase 的 Postgres 环境中创建数据库更改日志表

标签 java postgresql spring-boot liquibase

Maven 依赖项;
Spring Boot版本:2.2.3.RELEASE
Liquibase核心版本:3.8.5
Postgresql版本:42.2.9

我有一个针对 PostgreSQL 11 数据库运行的 Spring Boot 应用程序,该数据库呈现了以前未注意到的新行为。当我运行更新命令时 databasechangelog即使 databasechangeloglock 也没有在我的 Activity 模式中创建表正在创建表。这当然会导致运行因关系不存在而失败。然而;我不控制这个表的创建,也从未控制过它。过去该表是自动创建的,就像锁表一样,但现在不是了。

以下是我如何为数据库和 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 table ?还;看来 databasechangelog在我的公共(public)模式中生成的表对于我生成的每个数据库来说都很好......只是不在保存大量数据库对象的自定义模式对象中。

我查看了调试输出,发现我的 liquibase.Liquibase对象和相应的liquibase.database.Database对象完整且准确,并具有适当的名称 databasechangelogdatabasechangeloglock使用当前模式指定的表设置为我的值,但更改日志表拒绝与锁定表同时生成。不幸的是,一旦我创建 databasechangelog手动表中数据库更改日志中指定的其余对象将按预期创建。

最佳答案

我相信您没有按照预期的方式使用 SpringBoot 和 Liquibase 集成。 您不需要直接调用 liquibase。事实上,这可能是创建databasechangelog表没有创建的原因。如果您配置应用程序:

  • 确保使用 JDBC url 和指向更改日志的指针填写 application.properties
  • 当您调用 Springboot:run 时,该过程将自动查看您有一个数据库和变更日志,并将在启动之前运行迁移。
  • 如果您不希望数据库迁移在启动时运行而是手动运行,那么我会在 CICD 管道中使用 Liquibase CLI(例如 jenkins groovy 管道脚本)

这里是关于使用 Liquibase 设置 Springboot 的一个很好的入门: https://docs.liquibase.com/tools-integrations/springboot/using-springboot-with-maven.html

我也尝试过使用 SpringBoot 初始化:https://start.spring.io/ ,添加 Liquibase 作为依赖项

希望有帮助。

关于java - 未在 Liquibase 的 Postgres 环境中创建数据库更改日志表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62046924/

相关文章:

java - 为什么 m2e 插件会构建到 Maven jar 项目的目标文件夹中的 WEB-INF/classes 中?

使用restapifacade在play框架中的Neo4j上进行Java对象映射

ruby-on-rails - 第二个 foreign_key 加速查询

java - 是否可以使用 java -cp "jarName.jar"com.hw.Main 运行 spring boot 打包的 jar ?

java - 无法让 Proguard 混淆和 Spring Boot 一起工作

spring-boot - 在Spring Boot启动时通过名称指定应用程序配置文件

java - 将字节数组编码解码为字符串而不丢失数据

java - 如何将jar内的文件复制到jar外?

sql - 从子查询中删除 'not in' 子句

python - 类不以多态方式加载