【问题标题】:Database change log table not creating in Postgres environment for Liquibase数据库更改日志表未在 Liquibase 的 Postgres 环境中创建
【发布时间】: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 对象是完整且准确的,并使用适当命名的 databasechangelogdatabasechangeloglock 表指定了当前架构设置为我的值但是更改日志表拒绝在锁定表生成的同时生成。不幸的是,只要我手动创建 databasechangelog 表,数据库更改日志中指定的其余对象就会按预期创建。

【问题讨论】:

    标签: java postgresql spring-boot liquibase


    【解决方案1】:

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

    • 确保使用 JDBC url 和指向更改日志的指针填写 application.properties
    • 当你调用 Springboot:run 时,进程会自动看到你有一个 db 和 changelog,并且会在启动之前运行迁移。
    • 如果您不希望数据库迁移在启动时运行而是手动运行,那么我将在 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 作为依赖项

    希望对您有所帮助。

    【讨论】:

    • 我很感谢您的反馈;如果我的应用程序在内存中动态生成更改日志以供 Liquibase 使用怎么办?我没有物理更改日志,而是一组驱动创建更改日志及其相关更改集的配置。我在我的 java 应用程序中使用 Liquibase 的 API 来启动更新,因为它无法在启动时从属性文件(在当前状态下)运行。
    • 有趣。似乎还有改进的余地。请随时将问题添加到 github,我们可以将其视为功能请求。 github.com/liquibase/liquibase/issues
    • 天哪!然而,我希望避开这条路线;我会尽快收集必要的详细信息并放置机票。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 2013-06-01
    相关资源
    最近更新 更多