我正在处理一个分支,例如需要删除表 X 中的一列,我添加一个更改及其对该特定分支的好处,然后我切换到另一个仍然需要该列并且该更改需要回滚的分支。 数据库有很多变化,例如从分支到分支。
我为每个分支添加了一个新的更改日志 xml,并将其包含在主更改日志 xml 中。 显然,当我切换到另一个分支时,前一个分支的 changlog xml 不再在工作区中,并且 liquibase 不会将实际的变更集保存在数据库中,仅保存其名称和应用时间,因此它将无法自动回滚更改。
我正在使用 Liquibase Servlet 在应用程序启动时应用更改。
Liquibase专家,有没有一个简单的解决方案已经实施过这个问题? 谢谢!
很难在代码的分支之间共享单个数据库实例。如果您尝试在多个开发人员之间共享数据库,则会导致相同的问题。
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>