2016-08-30 41 views
1

我不確定這是否可行,但我試圖通過Flyway Java API以編程方式加載保存在SQL文件中的遷移。我(現在爲簡單起見)保存在基類路徑V1__Initial_version.sql一個簡單表的創建語句中的SQL文件:在Flyway Java API中使用SQL遷移文件

CREATE TABLE test_user (
    name VARCHAR(25) NOT NULL, PRIMARY KEY(name) 
); 

然後在Java程序中我使用

Flyway flyway = new Flyway(); 
flyway.setDataSource(jdbc_url, user, password); 
int migrations = flyway.migrate(); // Just to check the # of migrations applied 

我看到ClassPathScanner通過類路徑查看有效的遷移,但似乎忽略了sql遷移文件。當我從命令行呼叫flyway migrate時,同樣的sql遷移文件可以正常工作。我創建了一個java類,並從JdbcMigrations類繼承而來,ClassPathScanner選擇了它。我需要做些什麼才能獲得Java ClassPathScanner拾取的.sql文件並將其用作有效的遷移?

大局觀

也許我錯誤地要對這個擺在首位,所以我會添加什麼,我試圖做的。我試圖建立一個測試數據庫,我可以使用,核武器,並在測試之間重建。 I.E. TestA在表中輸入一些東西,預測試函數會清理數據庫並重置它,然後TestB將擁有一個乾淨的數據庫和空表來執行它的測試。我在預測試函數中使用了flyway.clean()和flyway.migrate(),但它會破壞schema_version表以及其他所有內容,然後遷移不會從之前的基線重建。

任何幫助表示讚賞!謝謝!

+0

我真的不明白的點的摧毀架構。數據,是的,但架構?我會使用DbSetup(http://dbsetup.ninja-squad.com/)。免責聲明:我是作者。 –

+0

你說的沒錯,實際上沒有任何意義去強化模式。我試圖做的是清除數據,但使用** flyway.clear **也刪除我的模式表。我沒有看到另一種方式讓flyway清除數據,但保留表格和模式。 –

+2

這不是Flyway的目的。 Flyway的工作是進行圖式演變。 –

回答

3

不知道爲什麼它沒有選擇你的任何遷移。也許他們需要在特定的目錄中?你需要檢查src代碼,看看它爲什麼不選擇你的文件進行遷移。

關於大局觀:

我們通常使用的飛行路線遷移測試數據庫:遷移,我們運行構建和測試案例之前。我們使用DBUnit,Spring測試或類似的單元測試框架,這些框架允許使用數據進行預測試數據庫設置。測試過程中結構不應該改變,因此不需要數據庫遷移。的Arquillian可以爲DB初始化非常有用的運行測試,以及前,看到這裏https://github.com/arquillian/arquillian-extension-persistence

編輯1 所以我創建了一個小例子

import org.flywaydb.core.Flyway; 
public class TestClass { 
public static void main(String args[]) { 
    Flyway flyway = new Flyway(); 
    for (String location : flyway.getLocations()) { 
     System.out.println(location); 
    } 
    flyway.setDataSource("jdbc:h2:~/test", "sa", ""); 
    System.out.println("Result: " + flyway.migrate()); 
} 
} 

把SQL文件到src/main/resources/db/migration並運行它。它拿起sql遷移就好了。如果你想要把SQL在不同的目錄,使用setLocations()

classpath:db/migration 
Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.util.VersionPrinter printVersion 
INFO: Flyway 4.0.3 by Boxfuse 
Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.dbsupport.DbSupportFactory createDbSupport 
INFO: Database: jdbc:h2:~/test (H2 1.4) 
Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.command.DbValidate validate 
INFO: Successfully validated 1 migration (execution time 00:00.009s) 
Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.command.DbMigrate migrate 
INFO: Current version of schema "PUBLIC": << Empty Schema >> 
Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.command.DbMigrate applyMigration 
INFO: Migrating schema "PUBLIC" to version 1.1 - Initial version 
Result: 1 
Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.command.DbMigrate logSummary 
INFO: Successfully applied 1 migration to schema "PUBLIC" (execution time 00:00.024s).

+0

我已經將sql遷移文件放置在與java類遷移相同的位置,它位於flyway查找的類路徑中.Java類沒有被拾取,而是sql文件沒有。 –

+1

您將使用我提到的db單元測試框架之一。清除數據庫可以是一個簡單的SQL,它禁用所有約束並截斷所有表。使用flyway爲每個測試構建數據庫模式不會很好地擴展,特別是一旦您有更多的數據庫遷移和更多的測試。 – Guenther

+0

謝謝,這與JB Nizet在評論中給出的建議類似,並且清除了部分問題。我仍然想從sql而不是java JdbcMigration類中進行基本遷移。 –