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

问题描述 投票:0回答:2

我有一个 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 丢失或错误,那么我认为它也不应该能够创建表?

postgresql liquibase rollback changeset liquibase-hibernate
2个回答
0
投票

mvn liquibase:回滚

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

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

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

mvn liquibase:rollback -Dliquibase.rollbackTag=1.0

这将执行标记“1.0”之后执行的所有变更集的回滚语句。访问此链接了解如何标记数据库的详细信息。

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

mvn liquibase:rollback -Dliquibase.rollbackCount=1

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

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

有关更多详细信息,请参阅这篇文章,它解释得非常清楚。另请查看这篇文章


0
投票

发生这种情况是因为 Spring Boot Liquibase 集成和 Maven Liquibase 插件使用不同的属性源。

Spring Boot 通常使用

src/main/resources/application.properties
application.yaml
。 Liquibase 和 Maven Liquibase 插件使用
liquibase.properties
。 Maven 还可以使用
pom.xml
中的属性。各个属性的命名也不同。

更多,Spring Boot 使用的变更日志文件被视为相对于

src/main/resources/
,因此它们要么需要
logicalFilePath
设置,要么 Maven 应该从该目录运行,如下所示:

(cd src/main/resources/ && mvn -f ../../../ org.liquibase:liquibase-maven-plugin:rollback -Dliquibase.rollbackCount=1 -Dliquibase.changeLogFile=db/changelog/db.changelog-master.yaml -Dliquibase.url=jdbc:postgresql://localhost
:5432/db -Dliquibase.username=user -Dliquibase.password=pass)
© www.soinside.com 2019 - 2024. All rights reserved.