1

我正在处理一个分支,例如需要删除表 X 中的一列,我添加了一个更改并且它对那个特定的分支有好处,然后我切换到另一个仍然需要该列并且需要回滚该更改的分支. 数据库有很多变化,例如从一个分支到另一个分支。

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

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

Liquibase 专家,是否有一个简单的解决方案已经实现了这个问题?谢谢!

4

1 回答 1

3

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

Liquibase 旨在使用基于文件的变更集作为数据库变更的主记录。特殊表 DATABASECHANGELOG 旨在跟踪哪些变更集已应用于数据库实例。在分支之间切换会以许多不可预知的方式导致混乱,例如:

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

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

liquibase dropAll
liquibase update

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

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

更新

如果您使用 Maven,则可以从 Maven 调用此“重新同步”操作,如下所示:

mvn -Presync compile

此配置文件在您的 POM 中配置如下:

    <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>
于 2012-04-21T17:09:47.810 回答