我有一个 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”之后执行的所有变更集的回滚语句。访问此链接了解如何标记数据库的详细信息。
2. rollbackCount - 我们定义需要回滚的变更集数量。如果我们将其定义为 1,则最后执行的变更集将被回滚:
mvn liquibase:rollback -Dliquibase.rollbackCount=1
3. rollbackDate - 我们可以将回滚目标设置为日期,因此,该天之后执行的任何变更集都将回滚:
mvn liquibase:rollback "-Dliquibase.rollbackDate=Jun 03, 2017"
发生这种情况是因为 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)