5

我正在使用 H2 数据库来存储我的数据,并使用 liquibase(带有休眠插件)来检查数据库和 projet 之间的差异。

假设我有以下代码:

@Entity
public class myEntity{

    @Column(name="val")
    private int value;

}

数据库已经到位并且已经存储了一些数据。

现在,当我将上面的列重命名,即从 val 到 value 并运行 liquibase:diff 时,difflog 说删除列“val”并添加列“value”。

显然这不是我想要的,因为原来存储在“val”列中的所有数据都会消失。

有没有办法告诉 liquibase 它不是一个新列,而是一个旧的重命名的列?

我想运行 liquibase:diff 并且生成的 diffLog 应该自动包含我的列的 rename... 标签,而不是 add.. 和 drop.. one..

4

2 回答 2

4

您是否尝试使用如下变更集(或者我的问题是错误的)

   <changeSet author="liquibase-docs" id="renameColumn-example">
        <renameColumn columnDataType="int"
                newColumnName="value"
                oldColumnName="val"
                remarks="A change in names"
                schemaName="public"
                tableName="myEntity"/>
    </changeSet>
于 2016-09-14T06:56:31.590 回答
1

目前一般来说,差异无法检测到列更改是重命名而不是删除和创建。对于使用差异创建更改的任何系统都是如此,而不仅仅是 Liquibase。

想象你自己是 liquibase——给你两张处于你描述的状态的表。您如何确定一列已重命名与删除一列并创建另一列?我唯一能想到的就是需要查看列的内容,看看它们“基本相同”。在这种特殊情况下,这是不可能的,因为要比较的数据库包括一个填充了数据的数据库和一个只是由 Hibernate 创建的空内存数据库。

于 2016-09-14T15:01:03.180 回答