如何使用liquibase,一个具体的例子

ape*_*ari 32 database version-control change-management liquibase

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>
Run Code Online (Sandbox Code Playgroud)

我已经创建了一个干净的模式,并且我已经启动了migrate命令.

Liquibase使用支持表databasechangelog和..lock创建了数据库.

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

Migration Failed: Validation Failed:
     1 change sets check sum
Run Code Online (Sandbox Code Playgroud)

所以我认为没有理解使用liquibase的方式.

有人可能会指出我正确的方向?

谢谢

Chs*_*y76 39

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

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

QuickStart很好读,但它确实很快:-)查看完整的手册,特别是它的ChangeSet部分.

  • 有时您需要修改发布的ChangeSet元素.请参阅Javid提供的runOnChange答案以获取更多信息.我们曾经做过"永不改变"的事情,但发现当你需要更新changeSet时,这是一个非常难以坚持的策略(当你更多地参与liquibase时,这会发生在你身上).保持选项开放. (4认同)

Jav*_*mae 27

根据Liquibase 2.x的变化,目前接受的答案略有过时.在2.x版本中,如果更改集的md5校验和已更改,则Liquibase仍将失败,但如果您希望能够修改它,则可以指定runOnChange属性.

文档:

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

  • 这个答案应该与接受的答案一起考虑.. runOnChange将允许您修改现有的变更集.接受的答案是正确的,说您不应该更改现有的变更集,但有时您可能需要,并且您的策略应该允许它. (2认同)