2012-04-20 461 views
1

我正在一个分支上,例如需要删除表X中的一列,我添加了一个更改和它的特定分支的好处,然后我切换到另一个分支,仍然需要该列和变更需要回滚。对分支有很多改变,比如从分支到分支。Liquibase自动回滚

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

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

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

+0

你有一个数据库和许多分支机构?或者它是一个临时数据库,每个测试运行都有新的数据库? – yegor256 2012-04-20 15:50:54

+2

我想你需要a)每个分支一个DB b)每个分支一个更新日志。为多个分支维护单个更新日志竟然是错误倾向 – 2012-04-20 15:52:51

+0

我有一个每个分支的更改日志,并且只有一个数据库实例,所以我不需要多个数据库,因为我是唯一的开发人员。 – user979051 2012-04-20 16:15:33

回答

2

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

Liquibase旨在将基于文件的变更集用作数据库更改的主记录。专用表DATABASECHANGELOG旨在跟踪哪些变更集已应用于数据库实例。分支之间的切换导致的混乱中很多无法预测的方式,例如:

  • 缺少的变更
  • 变更其内容发生了变化(信息,以校验和错误)。
  • ...

最好的建议是刷新或重新同步的数据库,只要你分支之间切换:

liquibase dropAll 
liquibase update 

在你的情况下,第二操作为liquibase的servlet probabily不必要的会在启动时更新数据库。

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

更新

如果你使用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>