为什么我的回滚在 Liquibase 中不起作用?

问题描述

我有一个 Spring Boot 应用程序,我正在尝试使用 Liquibase 测试一些迁移。我正在尝试查看回滚功能的工作原理,但我不断收到错误消息。

这是迁移文件

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                  https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">

    <changeSet id="1" author="Me">
        <createTable tableName="Person">
            <column name="id" type="int" />
            <column name="name" type="string" />
        </createTable>
        <rollback>
            <dropTable tableName="Person" />
        </rollback>
    </changeSet>

</databaseChangeLog>

当我运行应用程序时,表被正确创建...但我不知道如何或在哪里运行命令来执行回滚。我尝试在 IntelliJ 的 Maven Goal 中运行以下命令:

mvn liquibase:rollback

当我运行它时说:

Failed to execute goal org.liquibase:liquibase-maven-plugin:3.10.3:rollback (default-cli) on project party: 
The database URL has not been specified either as a parameter or in a properties file.

如果数据库 URL 丢失或错误,那么我认为它也不应该创建表?

解决方法

mvn liquibase:回滚

此命令执行变更集的回滚段,并应恢复在更新阶段完成的任务。但是如果我们单独发出这个命令,构建就会失败。

这是因为我们没有指定回滚的限制。通过回滚到初始阶段,数据库将被完全清除。因此,必须定义以下三个约束之一以在满足条件时限制回滚操作:

1. rollbackTag - 我们可以将数据库的特定状态定义为标记。因此,我们可以回到那个状态。实现此目的的命令是:

mvn liquibase:rollback -Dliquibase.rollbackTag=1.0

这将执行标记“1.0”之后执行的所有变更集的回滚语句。有关如何标记数据库的详细信息,请访问 this link

2. rollbackCount - 我们定义需要回滚的变更集数量。如果我们将其定义为 1,则最后一次执行的变更集将被回滚:

mvn liquibase:rollback -Dliquibase.rollbackCount=1

3. rollbackDate - 我们可以将回滚目标设置为日期,因此,在该日期之后执行的任何变更集都将被回滚:

mvn liquibase:rollback "-Dliquibase.rollbackDate=Jun 03,2017"

有关更多详细信息,请转至 this article,它的解释非常清楚。另请查看this post

,

尝试在回滚标签中传递架构名称或目录名称。