【问题标题】:Add new column via liquibase only if not already exists仅当尚不存在时才通过 liquibase 添加新列
【发布时间】:2022-11-12 04:05:23
【问题描述】:

我想在 spring boot 启动时使用 liquibase 将新列添加到现有表中。

但是在我正在使用的特定模式中,我已经手动添加了它。

所以我在启动时收到一个错误,表明该列已经存在(因为它确实存在):

Error creating bean with name 'liquibase' defined in class path resource 
[...LiquibaseConfiguration.class]: LiquibaseException: 
liquibase.exception.MigrationFailedException: Migration failed for 
change set db/changelog/AlterTable_MyTable_AddNewCol.xml::1::me (manual):
 Reason: liquibase.exception.DatabaseException: 
Duplicate column name 'new_col' [Failed SQL: (1060) 
ALTER TABLE my_schema.my_table ADD new_col INT NULL]

是否有一个 liquibase 前提条件选项来添加列只有当它尚不存在;如果它已经存在,不要出错?

我尝试了以下操作,并且出现了上述错误的过程错误:

<databaseChangeLog ... >
    <changeSet author="me (manual)" id="1">
        <preConditions onFail="WARN">
            <columnExists tableName="my_table" columnName="new_col" />
        </preConditions>
        <addColumn tableName="my_table">
            <column name="new_col" type="integer"/>
        </addColumn>
    </changeSet>
</databaseChangeLog>

【问题讨论】:

    标签: liquibase


    【解决方案1】:

    您缺少两个元素:

    1. 将 onFail 设置为 MARK_RUN,因为您希望在不停止整个数据库更新(并引发错误)的情况下成功完成更改集。当然,由于前提条件失败,更改集将不会应用于数据库。
    2. 添加&lt;not&gt;操作员。前提应该是该列不存在,然后应用更改集.

      试试这个更改集而不是你的:

      <changeSet id="1" author="me (manual)">
              <preConditions onFail="MARK_RAN">
                  <not>
                      <columnExists tableName="my_table" columnName="new_col" />
                  </not>
              </preConditions>
              <addColumn tableName="my_table">
                  <column name="new_col" type="integer" />
              </addColumn>
      </changeSet>
      

      更多详情可以查看adding column if not exists的文章。

    【讨论】:

      猜你喜欢
      • 2016-10-19
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2011-04-03
      • 2021-12-03
      • 1970-01-01
      相关资源
      最近更新 更多