【问题标题】:Liquibase scripts with PostgresQL and with H2使用 PostgresQL 和 H2 的 Liquibase 脚本
【发布时间】:2021-10-07 21:17:38
【问题描述】:

目前我的默认 Liquibase 脚本设置为未提供 dbms - 这应被视为“对所有数据库都有效”。

一些脚本依赖于 JSONB 等数据库特定功能:

POSTGRES

<changeSet id="add_jsonb_field" author="me" dbms="postgresql">
        <preConditions />

        <addColumn tableName="postgresTable">
            <column name="someField" type="JSONB" />
        </addColumn>

        <rollback />
</changeSet>

H2

<changeSet id="add_text_field" author="me" dbms="h2">
        <preConditions />

        <addColumn tableName="postgresTable">
            <column name="someField" type="text" />
        </addColumn>

        <rollback />
</changeSet>

我目前的假设是,在没有指定 dbms 的情况下,该脚本适用于任何数据库。指定 dbms 后,它只适用于给定的数据库类型。

所以 h2 应该执行所有通用脚本以及带有 h2 的那些标记。

我的假设是正确的还是 h2 会忽略不带 dbms 标记的脚本?

【问题讨论】:

    标签: spring postgresql hibernate h2 liquibase


    【解决方案1】:

    我会采用不同的方法来避免写两次&lt;addColumn&gt;

    在您的“主要”变更日志中(在任何其他变更集之前),放置以下属性定义:

      <property name="json_type" value="jsonb" dbms="postgresql"/>
      <property name="json_type" value="text" dbms="h2"/>
    

    那么您只需要一个使用占位符作为数据类型的变更集(没有 dbms 属性):

    <changeSet id="add_json_column" author="me">
            <preConditions />
    
            <addColumn tableName="postgresTable">
                <column name="someField" type="${json_type}" />
            </addColumn>
    
            <rollback />
    </changeSet>
    

    【讨论】:

    • 总的来说,我绝对同意,感谢您简洁的回答。有一些由于迁移版本控制而无法更改的遗留脚本,一般假设仍然成立吗?
    • 显然您正在更改脚本,因此您可以在您正在编辑的changeLog 中添加属性。但是是的,你的一般假设是正确的
    • 目前我只是想了解发生了什么,我在 H2 上的 postgres 和 JPA 错误上没有收到任何错误。谢谢你的解释!
    猜你喜欢
    • 2022-06-22
    • 2012-10-20
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2020-05-08
    • 2021-05-21
    • 2021-07-22
    • 2016-12-29
    相关资源
    最近更新 更多