【问题标题】:missing column 'CONTEXTS' after Liquibase migration to version 3.4.0 from 2.0.4Liquibase 从 2.0.4 迁移到版本 3.4.0 后缺少列“CONTEXTS”
【发布时间】:2015-06-30 09:43:35
【问题描述】:

我尝试将 Liquibase 从旧版本 2.0.5 迁移到 3.4.0。我尝试的第一件事是状态命令,导致读取表'databasechangelog'时出现问题:

执行 SQL SELECT 时出错 文件名、作者、ID、MD5SUM、执行日期、执行顺序、执行类型、描述、评论、标签、LIQUIBASE、标签、上下文 来自 IDENTSERVICE.DATABASECHANGELOG ORDER BY DATEEXECUTED ASC, ORDEREXECUTED ASC:ORA-00904:“上下文”

我似乎是表中的两个新列:LABELS 和 CONTEXTS Lquibase 网站告诉它只是一个替代品。

所以我的问题是:我是否需要先升级到 3.0.0 版,或者如何获得新列?手动操作不是一种选择。

【问题讨论】:

    标签: liquibase


    【解决方案1】:

    查看´StandardChangeLogHistoryService´ 类。

    搜索 hasContexts 例如有代码可以检查这些列是否存在。 因此,如果CONTEXTS 列的测试失败,则应该有一条日志行显示:

    "Adding missing databasechangelog.contexts column"。

    你可以检查你的日志。

    所以,是的,它应该是一个替代品。

    【讨论】:

    • 你提到的日志条目我找不到。我使用选项--logLevel=debug 将日志级别设置为调试。据我所知,liquibase 首先连接到数据库,然后加载dbchangelog-2.0.xsd。之后,它会查询失败的表 DATABASECHANGELOG。
    • 是的,但我认为检查现有的CONTEXT 和LABEL 列在init() 类的init() 方法中。我假设这是在对DATABASECHNAGELOG 表的任何查询之前运行的。但也许你在 liquibase 中发现了一个错误?我这里没有一个测试场景来重现这个,所以我真的不能告诉......
    • 据我了解 Liquibase 代码,在 reportStatus() 期间不会调用 init()。运行 update 命令后,将添加两列。但是对于旧版本的 Liquibase,我现在会遇到校验和错误。
    • 校验和是通过使用字段id/author/filepath 创建的。也许你的文件路径改变了?如果您只是将文件放在不同的目录中,就会发生这种情况。当您迁移到新版本时,为什么还要使用旧版本?
    • Status 和 updateSQL 不会更改数据库,这就是不调用 init() 的原因。 Liquibase 3.4.1 通过使用“SELECT *”而不是显式列出实际上可能不存在的列来解决该问题。
    【解决方案2】:

    解决方案不是运行状态命令,而是运行运行良好的更新命令。 小心,你不能回到旧版本的 Liquibase。旧版本出现校验和错误。

    【讨论】:

    • Liquibase 3.4.1 修复了该问题,因此您现在可以在运行更新之前运行状态。
    猜你喜欢
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2015-05-05
    • 2013-10-21
    • 1970-01-01
    • 2019-11-27
    • 2022-08-06
    • 2020-02-11
    相关资源
    最近更新 更多