2012-04-20 459 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>