35

按照关于liquibase的快速入门,我创建了一个变更集(非常愚蠢:))

代码:

<?xml version="1.0" encoding="UTF-8"?>

<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog/1.6"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog/1.6
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-1.6.xsd">

    <changeSet id="1" author="me">
        <createTable tableName="first_table">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(50)">
                <constraints nullable="false"/>
            </column>
        </createTable>
        <createTable tableName="new_table">
            <column name="id" type="int">
                <constraints primaryKey="true" nullable="false"/>
            </column>
        </createTable>
    </changeSet>

</databaseChangeLog>

我创建了一个干净的架构,并启动了 migrate 命令。

Liquibase 创建了数据库,支持表 databasechangelog 和 ..lock。

现在我如何跟踪更改?我已经修改了变更集,添加了一个新的 createTable 元素,但是当我尝试命令“update”时,liquibase 告诉我这个

Migration Failed: Validation Failed:
     1 change sets check sum

所以我不认为已经了解使用 liquibase 的方式。

有人可以指出我正确的方向吗?

谢谢

4

3 回答 3

39

您永远不应该修改<changeSet>已经执行的 a。Liquibase 计算所有已执行变更集的校验和并将它们存储在日志中。然后它将重新计算该校验和,将其与存储的校验和进行比较,如果校验和不同,则在下次运行时失败。

相反,您需要做的是添加另一个 <changeSet>并将新的 createTable 元素放入其中。

QuickStart 读起来不错,但确实很快 :-) 查看完整手册,尤其是其ChangeSet部分。

于 2009-07-19T02:53:15.023 回答
27

根据 Liquibase 2.x 的变化,这个当前接受的答案稍微过时了。在 2.x 版本中,如果变更集的 md5 校验和已更改,Liquibase 仍然会失败,但如果您希望能够修改它,可以指定runOnChange属性。

文档中:

runOnChange - 在第一次看到和每次更改集更改时执行更改

于 2011-11-07T17:57:40.523 回答
3

如果它是对基本上已经完成的变更集的更改,您可以手动修改数据库,以便该变更集的 md5 与新的匹配。适用于较小的文本更改。或者,您可以从表中删除该变更集行。

于 2013-07-11T22:51:59.260 回答