0

我最近开始在一个分支上工作,该分支由一个离开组织的开发人员开发,看起来他让相关的测试环境模式处于糟糕的状态。

有一个 Liquibase 更改文件,它进行了许多代码运行所必需的更改,但看起来关联的架构已经应用了一些更改。

我尽量不要手动更新任何模式,尤其是在不是我个人开发环境的情况下,所以我希望使现有的(相当复杂的)更改工作。

我得到的错误是这样的:

严重 2012 年 12 月 12 日下午 12:15:liquibase:更改集 db/changelogs/linechanges.xml::14::limit 失败。错误:执行 SQL ALTER TABLE 限制添加 ID 序列时出错:错误:关系“lineitem_limitgroup”的列“id”已经存在 liquibase.exception.DatabaseException:执行 SQL ALTER TABLE 限制添加 ID 序列时出错:错误:关系“的列“id”限制”已经存在于 liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:104) 的 liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:62) 的 liquibase.database.AbstractDatabase.execute(AbstractDatabase.java :1075) 在 liquibase.database.AbstractDatabase.executeStatements(AbstractDatabase.java:1059) 在 liquibase.changelog.ChangeSet.execute(ChangeSet.java:317) 在 liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.

请注意,此更改文件包含多个更改集。当我检查架构时,看起来某些 changeSet 的更改已应用,但其他一些更改未应用。

那么,有没有办法告诉 liquibase(最好通过 Maven 插件)忽略失败的变更集并继续?

或者(不太有用)有没有办法告诉 liquibase 应用一些 changeSet 而不是其他?

谢谢!!!

4

3 回答 3

1

看起来您的变更集已无意更新,因此您看到了问题。为已创建实体的模式等更改创建新的变更集而不是更新现有的变更集是一种很好的做法。

话说回来 :

在您的日志中,检查是否有其他更改集已添加该列。是的,有办法告诉 liquibase 应用一些更改而不是其他更改。

一种解决方法是:由于您的文件已经存在问题,您可以进行所有先前的更改以在任何正确运行的更改集下进行。由于changeset的唯一标识是基于-author,change,changeSetID。由于这个已经运行过一次,所以不管里面有什么sql都不会再去运行了。

于 2014-02-26T16:13:22.967 回答
0

我认为您最好的选择是使用 Liquibase 前提条件来告诉它仅在列不存在时才错误地运行 chanset。您将不得不像这样使用标签 columnExists :

<preConditions>
  <not>
    <columnExists columnName="id" tableName="limit" schemaName="yourSchemaNameHere" />
  </not>
</preConditions>

如果您在限制表中已经有 id 列,它会将脚本标记为运行而不实际运行任何更新。

您还有另外两个选择:

第一个选项。您可以在触发错误的变更集上将属性 failOnError 设置为 false。容易出错的变更集将一直运行到它们触发错误的地步。下一个变更集将正常运行。

小心使用它,因为它不会在错误时回滚变更集,也不会将变更集标记为运行。另请注意,如果您已经有一个将此属性设置为 false 的变更集,这可能解释了您进行部分更新的原因。

第二个选项,在表 DATABASECHANGELOG 中插入一行以向 Liquibase 表明它不必运行特定的变更集。实际上,这意味着变更集运行成功,但结果是 Liquibase 无论如何都不会尝试再次运行它。

于 2013-04-08T13:18:55.763 回答
0

Liquibase 不会两次应用变更集。但可能在其他分支的不同变更集中进行了一些相同(或不兼容)的更改。我认为您别无选择,只能手动编辑此分支的变更集,以便它们干净地应用。

于 2012-12-13T09:55:25.413 回答