2013-01-23 53 views
14

首先,有一點背景。我有一套Java應用程序,一些基於JPA,一些不是。要創建我的數據庫,我正在使用Hibernates模式導出爲使用JPA的用戶生成創建腳本。那些不使用JPA我手動生成腳本。然後在使用ANT安裝應用程序時運行這些程序。對於更新,應用程序安裝程序只是將更新腳本應用於數據庫。Can Flyway或Liquibase可以生成更新腳本,而不是直接更新數據庫?

爲了改進數據庫更新的管理我一直在尋找Flyway和Liquibase。兩者似乎都差不多要做我想做的事情(旁白:因爲我們有所有已有的SQL/DDL腳本,所以我現在更喜歡Flyway)。我能看到的問題是它們都直接更新數據庫。這對很多安裝都很好,但不是全部。

我想要做的是對數據庫運行Flyway/Liquibase並生成一個更新腳本,該腳本包含使數據庫保持最新所需的所有更新 - 包括Flyway/Liquibase需要對其自己的表進行的任何更改。這將允許我(或更重要的是數據庫管理員)在應用程序之外運行更新腳本來更新數據庫。然後,我可以在我的應用程序中使用Flyway/Liquibase純粹驗證數據庫是最新的。

是否可以使用Flyway或Liquibase或任何其他工具做到這一點?

+1

liquibase我最喜歡的一個特性是它能夠生成SQL腳本。我使用這個與偏執DBA的誰否認我訪問:-)對於演示請參閱:http://stackoverflow.com/questions/8397488/comparing-databases-and-genrating-sql-script-using-liquibase/ –

回答

8

Liquibase處理它很好。它會以當前狀態查看數據庫,發現未應用的更改集並在sql output mode中使用update命令生成SQL腳本。

使用合適的數據庫遷移工具而不是Hibernate生成器是無論如何,遲早會導致Hibernate不支持的情況。對於我們來說,它正在放棄一個獨特的索引並用另一個索引替代它您還可以使hibernate.hbm2ddl.auto=validate對數據庫結構和實體bean之間的兼容性感到安全。

+0

謝謝你。 SQL輸出功能在文檔中很清楚 - 不知道爲什麼我錯過了它。 – pauli

+1

使用liquibase-hibernate擴展,您可以直接從已更改的hibernate實體生成變更集。 –

5

你想要的是一個模式比較工具。我記得聽說TOAD的功能相當強大。 Hibernate也將嘗試基於它檢測到的實體和數據庫元數據來生成模式更新腳本。

但是,您需要的是......不這樣做,而是使用Flyway來更改所有數據庫。那就是你應該關閉Hibernates自動模式更新並自己寫下模式更新。每當你想要更改數據庫時,都必須編寫一個模式更新。

有些人捕獲了休眠模式更新的SQL輸出,作爲獲取自動化模式更新更新的一種方式。問題在於,如果添加一個@NotNull列,休眠通常是錯誤的。

同樣在你的管理方面,我相信Flyway可以根據它的schema_version表和SQL/Java遷移腳本輸出它將運行的SQL輸出,因此你的DBA可以在Flyway之外運行它(如果它不這樣做,是一個簡單的功能來添加)。

+1

只是澄清,Flyway不會產生SQL輸出,它會立即針對數據庫執行。但是,Flyway命令行工具允許您在應用程序之外運行相同的遷移,並且應該適合您的需求。 –

+1

是的,但我可以看到爲什麼DBA可能希望查看Flyway運行之前要運行的SQL。理論上,你似乎可以讓Flyway試圖改變模式,然後回滾或者甚至不執行命令......對吧?順便說一句,我喜歡Flyway ......感謝你的支持。 –

2

是的,生成SQL腳本是Liquibase的一項內置功能。 Liquibase比flyway有優勢的另一個領域是能夠遷移數據庫代碼更改(包,程序和函數)。我使用了飛行路線,但我很想在飛路上提供這些Liquibase功能。

+0

Flyway也支持數據庫代碼更改。 – trondd