当前位置: 首页 > 知识库问答 >
问题:

Liquibase自动回滚

危文乐
2023-03-14

我正在处理一个分支,例如需要删除表X中的一列,我添加了一个更改,它对该特定分支有好处,然后我切换到另一个分支,该分支仍然需要该列,并且该更改需要回滚。db在不同的分支之间有很多变化,比如这样的变化。

我为每个分支添加一个新的changelog xml,并将其包含在主changelog xml中。显然,当我切换到另一个分支时,前一个分支的changlog xml不再在工作区中,并且liquibase不会在数据库中保存实际的变更集,只保存其名称和应用的时间,因此它将无法自动回滚变更。

我正在使用Liquibase Servlet在应用程序启动时应用更改。

Liquibase的专家们,这个问题有没有一个已经实现的简单的解决方案呢?谢谢你!

共有1个答案

江浩慨
2023-03-14

很难跨代码分支共享单个数据库实例。如果您尝试在多个开发人员之间共享数据库,则会导致同样的问题。

Liquibase被设计为使用基于文件的变更集作为数据库变更的主记录。设计了专用表DATABASECHANGELOG跟踪数据库实例中应用了哪些变更集。在分支之间切换会以许多不可预测的方式引起混乱,例如:

  • 缺少变更集
  • 内容已更改的变更集(导致校验和错误)。
  • ...

当您在分支之间切换时,最好的建议是刷新或重新同步数据库:

liquibase dropAll
liquibase update

在您的情况下,第二个操作可能是不必要的,因为liquibase servlet将在启动时更新数据库。

如果您担心丢失数据,那么使用上下文来控制测试数据。

mvn -Presync compile
    <profile>
        <id>resync</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.liquibase</groupId>
                    <artifactId>liquibase-maven-plugin</artifactId>
                    <version>${liquibase.plugin.version}</version>
                    <executions>
                        <execution>
                            <phase>process-resources</phase>
                            <configuration>
                                <url>${liquibase.url}</url>
                                <driver>${liquibase.driver}</driver>
                                <username>${liquibase.username}</username>
                                <password>${liquibase.password}</password>
                                <changeLogFile>${liquibase.changeLogFile}</changeLogFile>
                                <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
                            </configuration>
                            <goals>
                                <goal>dropAll</goal>
                                <goal>update</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
 类似资料:
  • 我正在试用Liquibase,目的是尝试自动化数据库部署,并获得数据库更改的一些结构。 这里是我想评估自动回滚的变更集。现在,我试图在中引入一个错误,并希望在错误发生后运行,它还会从表中删除列。 http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd“> 但是真正发生的是表中没有条目。但表中的列仍然存在。我确实查看了liqui

  • 假设我有一个包含3个变更集的changeLog文件。如果我从命令行运行Liquibase Update命令,但它在第二个变更集上失败,那么Liquibase会回滚到Update命令开始执行之前吗?还是保留变更集1中的变更?

  • case-0-3.sql: 我在进行任何更改之前标记数据库: 之后,我在每个文件应用后应用文件和标记数据库: 求求你,救命。可能有人在sql或其他格式中使用回滚操作?哪里错了?我做错了什么?它是工作液基功能吗?

  • case-0-3.sql: I在进行任何更改之前标记数据库: 之后,我应用文件,并在每个文件应用后标记数据库:

  • 我在实体中有以下Id描述: 生成此id的分解指令如下: 此外,我还有一些分解脚本,可以在此表中插入预定义的值,例如。 当我尝试使用Jpa存储库插入没有id的新记录时,问题出现了。我收到了一条类似“重复id”的错误消息。所以,我知道jpa(hibernate)不使用postgresql序列来获取新的id值。我不想在实体的id描述中包含序列名。我希望postgresql本身能够解决这种情况。我不会使用

  • 我的问题是liquibase没有回滚我的一些变更集,这些变更集是在我试图回滚的变更集上设置标签后执行的。 例如,我创建了两个按正常方式执行的变更集(A和B)。然后,我创建了另一个变更集,它将变更集B的标记设置为Release1。并且这个变更集也按预期工作。但是,我随后执行另外5个变更集,所有变更集都使用回滚命令。而且这些也执行得很好。 现在,这个回滚不应该回滚在执行release1标记之后执行的任