【问题标题】:Database Migration from one version to another using Liquibase使用 Liquibase 从一个版本到另一个版本的数据库迁移
【发布时间】:2019-11-27 08:50:34
【问题描述】:

我推出了第一个版本的应用程序,并为此设置了 Postgres 服务器。

我计划推出我的应用程序的第二个版本,它在我的表中进行了结构更改。

例如:我有一个名为 version 的列的 App 表,现在我有另一个名为 releaseVersion 的列,我必须申请 alter 来添加此列。在这种情况下,我如何使用 liquibase 生成/应用migration 脚本?

liquibase 能做到这样的migration吗?

简而言之,对于我的第一个版本,我使用 DDL 创建了表

CREATE TABLE App (version varchar); // I manually generated this using liquibase offline mode and my metadata.

现在我有了上面列的数据库。

我需要使用liquibase 生成更改以添加列。像这样的

ALTER TABLE App ADD releaseVersion varchar;

是否可以使用Liquibase,因为它是migration 的行业标准。

我使用了liquibase:diff,但它只能从两个数据库(target dbbase db)创建差异changelog。在我的例子中,只有一个生产数据库。

【问题讨论】:

    标签: database-migration liquibase liquibase-hibernate


    【解决方案1】:

    是的,这是可能的。

    像这样创建一个变更集:

    <changeSet author="foo" id="bar">
        <preConditions onFail="MARK_RAN">
            <and>
                <columnExists tableName="App" columnName="version"/>
                <not>
                    <columnExists tableName="App" columnName="releaseVersion"/>
                </not>
            </and>
        </preConditions>
        <renameColumn tableName="App" oldColumnName="version" newColumnName="releaseVersion" columnDataType="varchar(100)"/>
    </changeSet>
    

    并应用它,使用liquibase update 命令。

    如果您只需要添加一个新列,那么您的 changeSet 将如下所示:

    <changeSet id="foo" author="bar">
        <preConditions onFail="MARK_RAN">
            <not>
                <columnExists tableName="App" columnName="releaseVersion"/>
            </not>
        </preConditions>
        <addColumn tableName="App">
            <column name="releaseVersion" type="varchar(100)"/>
        </addColumn>
    </changeSet>
    

    【讨论】:

    • 如果“releaseVersion”是我的新专栏,而不是重命名的旧专栏。
    • 在这种情况下,您只需使用addColumn 标签。我已经更新了我的答案。
    猜你喜欢
    • 2022-09-30
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多