2016-08-04 38 views
0

主要問題 - 這似乎是一個基本的飛行路線的問題,我可能會(在某種程度上)我的研究過程中錯過了這一點,但 - 這可能訪問的應用程序嘗試使用flyway遷移數據時使用的服務(配置了spring)?遷飛DB遷移 - 如何訪問應用服務(配置春季)

其他細節 - - 下面的幾個細節

  • 我知道我們不能注入春天的數據服務等。(learnt from this SO question)。我從數據訪問點 的角度瞭解這一點。
  • 但是我們不能使用(注射)​​任何其他應用服務 要麼同時使用飛路(我搜索的例子 - 但沒有 運氣,並沒有對飛行用文件給出任何細節)
  • 讓我們說我們不能用任何Spring服務(我找到一些方法來解決這個問題),我們可以訪問在 application.properties/.yml中聲明的屬性(這也不可能)。

把上面的我們的要求方面 - 我們已經增加了幾個新領域的幾桌,當我們要填充這些列與數據發佈的一部分。這要求我們(或飛路)執行以下算法 -

  • 從第一個表中獲取數據。
  • 使用來自每行的一些數據,使用API​​ 調用查找更多數據。
  • API的URL是特定於環境的(因此上面的第三點 )。
  • 將從API返回的數據更新到新添加的列中。
  • 爲下表重複上述步驟。

P.S. - 我知道,添加依賴於同一個表中的其他列的列不符合第三常規等,但由於本文之外的原因,它是必需的。

技術堆棧 -

  1. 春天啓動的1.3.x
  2. 遷飛4.0.3
  3. 使用Java遷移

幾個例子,我試過如下 -

我的飛路m移民課程如下。

public class R__MigrationYeah implements SpringJdbcMigration { 

    @Value("${mypath.subpath}") // this does not work ! 
    private String someStringIwannaUse; 


    @Inject // this does not work either (even with Autowired or Const. injection)! 
    private MyService myService; 

} 

我看到一些帖子/有關於如何配置飛行路線繁複的細節博客MigrationResolver或ConfigurationAware等等 - 不知道他們解決這個問題(即使他們這樣做 - 這是工作很多剛編寫一個快速遷移腳本 - 這是唯一的方法嗎?)。

最後 - 我知道我失去了一些東西,因爲如果我們要編寫飛行用的Java代碼,而不能使用任何現有應用程序類直通春天,那就不會有比寫一個獨立的遷移項目(因此沒有不同除了使數據庫連接可用外,通過flyway添加的值) - 我確信這不是這種情況。

任何幫助將是偉大的!

+0

**更新** - 我們終於結束了使用的解決方法解決方案(如在上述問題的最後一節,也從@DanielKafer下面的答案)。由於這種方式不適用于飛行路線。 _P.S。不清楚爲什麼下面的問題被低估?對於新手來說,我錯過了什麼嗎? –

回答

0

在飛路遷移中不可能使用依賴注入。

從遷徙路線的下一版本將支持從春豆依賴注入。有關更多詳細信息,請參閱Github issue。在Stack Overflow是可用的當前版本的解決方法。

-2

我想你想更動態使用的飛行路線,比它的設計。 基本上它只是爲DB-模式,你可以做任何事情SQL可以做,但因爲 它它工作在一個可重複的,可靠的,一步一步,你不希望它 任何實際業務數據的方式。 Flyway使用您提供的靜態腳本,您不能讓它們隨着時間的推移而動態更改(它會通過校驗和不匹配)或「API調用」。

-2

對於這樣的東西,你可以創建自己的春天啓動的應用程序,並通過它使用遷飛的Java API。沿着這條線的東西。

@SpringBootApplication 
@Import(ServiceConfig.class) 
public class FlyWayApp implements CommandLineRunner { 

    public static void main(String[] args) { 
     SpringApplication.run(FlyWayApp.class, args); 
    } 

    @Value("${mypath.subpath}") 
    private String someStringIwannaUse; 


    @Autowired 
    private MyService myService; 


    @Override 
    public void run(String... args) throws Exception { 
     // Create the Flyway instance 
     Flyway flyway = new Flyway(); 


     // Point it to the database 
     flyway.setDataSource("jdbc:h2:file:./target/foobar", "sa", null); 

     //Fetch data and create migration scripts needed by Flyway 
     myService.createMigrationScripts(); 

     // Start the migration 
     flyway.migrate(); 
    } 
}