addAfterColumn 在postgresql上不被允许。

3
为了修复漏洞,我在我的dockerfile中升级了docker镜像版本:
旧的:
FROM liquibase/liquibase:4.4

新建:

FROM liquibase/liquibase:4.20

但是我开始出现错误:

addAfterColumn is not allowed on postgresql

我开始调查这个错误,并发现在某些变更集中使用了addAfterColumn

<changeSet author="***" id="***">
    <addColumn tableName="my_table" >
      <column afterColumn="existing_column"
        name="new_column"
        type="varchar(255)" >
        <constraints nullable="true"/>
      </column>
    </addColumn>
  </changeSet>
</databaseChangeLog>

我也找到了这个主题:

https://github.com/liquibase/liquibase/issues/3091

所以我只是移除了afterColumn,但是我不确定会有什么副作用?我对使用afterColumn的原因不熟悉,但如果它被移除了,可能就没有用处了,但我找不到任何有用的信息。

是否有其他选项来解决问题?因为编辑liquibase脚本会破坏现有数据库的校验和。


在Postgres中,列始终是“在末尾”添加的。因此,如果Liquibase在先前版本中接受了该属性,则必须已忽略它。 - user330315
@a_horse_with_no_name 但是为什么?人们说这有道理。 - gstackoverflow
为什么?因为没有人实现过这个功能。 - user330315
@a_horse_with_no_name 所以这是之前版本的Liquibase中的一个错误吗? - gstackoverflow
3个回答

2

移除“afterColumn”,使其在新的环境中正常工作。 为了避免在已执行更改集的环境中出现验证失败,添加原始校验和:

  <changeSet>
    <validCheckSum>9:6a4c63a04890c57dd610abc39389b4ce</validCheckSum>
        or
    <validCheckSum>ANY</validCheckSum>

遇到了与addAutoIncrement / incrementBy相同的问题,上述解决方案可以正确修复问题。应该接受这个答案。 - undefined

1

正如此拉取请求所示,以前的liquibase没有警告列排序可能不会被应用,因为数据库不支持它。因此,在旧版本中它会默默失败,但现在它会显示一个错误。引用最重要的一行:

破坏性变更:由于我修复了验证逻辑,对于在不支持该属性的数据库上使用beforeColumn、afterColumn或position属性的addColumn的任何人现在都将获得验证错误,而不是被忽略。


3
所以他们破坏了向后兼容性,而且没有禁用这个“增强”功能的能力。疯狂的人们。 - gstackoverflow

0

您可以尝试使用modifySql来进行建议,可以从这里开始: https://github.com/liquibase/liquibase/issues/3094#issuecomment-1195961510

<changeSet id="***" author="***">
    <addColumn tableName="my_table">
        <column name="new_column" type="varchar(255)"/>
    </addColumn>
    <modifySql dbms="postgresql">
        <append value=" position 4"/>
    </modifySql>
</changeSet>

看起来在liquibase 4.13中https://github.com/liquibase/liquibase/pull/2943,他们修复了一些不需要修复的东西,就像在https://github.com/liquibase/liquibase/issues/3091中,他们试图增强/修复他们自己的修复。除了破坏向后兼容性(如@gstackoverflow在评论中所写),它也会在产品支持多种类型数据库时打破逻辑(对于mySQL没有错误,而对于Oracle/MsSQL/PostgreSQL有错误)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接