2011-08-18 79 views
3

是否有可能將db遷移輸出到SQL文件,而不是直接調用flyway中的數據庫更改?Flyway輸出到SQL文件

+0

你能告訴我更多關於你的用例嗎?這是你需要Java遷移的東西嗎?或者你想要用佔位符替換你的輸入sql? –

+0

我假設對於生產數據庫,我不能通過jdbc自己更新數據庫,但將腳本發送給某個數據庫團隊。 – bertolami

回答

0

我沒有找到辦法。切換到mybatis遷移。看起來不錯。

0

大多數情況下,這並不需要,因爲使用Flyway時,數據庫遷移本身已經以SQL編寫。

1

是的,這是可能的,並且就我而言,該功能對於不想允許在產品中使用flyway的DBA絕對是必須的。

我與從這裏修改代碼做的,它是飛行用幹運行命令,你可以添加一個FileWriter寫出來migrationDetails:

https://github.com/killbill/killbill/commit/996a3d5fd096525689dced825eac7a95a8a7817e

我做到了,是這樣的...項目結構(剛纔複製出來殺死比爾的項目,並更名爲包flywaydr:

. 
./main 
./main/java 
./main/java/com 
./main/java/com/flywaydr 
./main/java/com/flywaydr/CapturingMetaDataTable.java 
./main/java/com/flywaydr/CapturingSqlMigrationExecutor.java 
./main/java/com/flywaydr/DbMigrateWithDryRun.java 
./main/java/com/flywaydr/MigrationInfoCallback.java 
./main/java/com/flywaydr/Migrator.java 
./main/java/org 
./main/java/org/flywaydb 
./main/java/org/flywaydb/core 
./main/java/org/flywaydb/core/FlywayWithDryRun.java 

在Migrator.java添加(執行回調並把它放在DbMigrateWithDryRun.java):

} else if ("dryRunMigrate".equals(operation)) { 
     MigrationInfoCallback mcb = new MigrationInfoCallback(); 
     flyway.dryRunMigrate(); 
     MigrationInfoImpl[] migrationDetails = mcb.getPendingMigrationDetails(); 

     if(migrationDetails.length>0){    
      writeMasterScriptToFile(migrationDetails); 
     } 
} 

然後寫東西文件是這樣的:

private static void writeMasterScriptToFile(MigrationInfoImpl[] migrationDetails){ 

    FileWriter fw = null; 
    try{ 
     String masterScriptLoc="path/to/file"; 

     fw = new FileWriter(masterScriptLoc); 
     LOG.info("Writing output to " + masterScriptLoc); 
     for (final MigrationInfoImpl migration : migrationDetails){ 
      Path file =Paths.get(migration.getResolvedMigration().getPhysicalLocation()); 
      //if you want to copy actual script files parsed by flyway 
      Files.copy(file, Paths.get(new StringBuilder(scriptspathloc).append(File.separator).append(file.getFileName().toString()).toString()), REPLACE_EXISTING); 


     } 
      //or just get the sql 
      for (final SqlStatement sqlStatement : sqlStatements) { 
        //sqlStatement.getSql(); 
      } 
     fw.write(stuff.toString()); 
    } catch(Exception e){ 
      LOG.error("Could not write to file, io exception was thrown.",e); 
    } finally{ 
      try{fw.close();}catch(Exception e){LOG.error("Could not close file writer.",e);} 
    } 

} 

最後一件事提了,我編譯和打包放進一個.jar「具有相關性」通過行家(又名fatjar)(谷歌組裝插件+具有依賴關係的jar)並通過下面的命令運行它,或者你可以將它作爲一個依賴包含進來,並通過mvn exec:exec目標來調用它,這也是我成功的一個目標。

$ java -jar /path/to/flywaydr-fatjar.jar dryRunMigrate -regular.flyway.configs -etc -etc