2011-08-18 3 views
3

플라이웨이에서 직접 데이터베이스 변경을 호출하는 대신 SQL 마이 그 레이션을 SQL 파일로 출력 할 수 있습니까?SQL 파일로 플라이 웨이 출력

+0

사용법에 대해 좀 더 알려주시겠습니까? 이것은 Java 마이그레이션에 필요한 것입니까? 또는 자리 표시자를 대체하여 입력 SQL을 가져 오시겠습니까? –

+0

프로덕션 데이터베이스의 경우 jdbc를 통해 데이터베이스를 직접 업데이트 할 수는 없지만 일부 데이터베이스 팀에 스크립트를 전송한다고 가정합니다. – bertolami

답변

0

나는 방법을 찾지 못했습니다. mybatis 마이그레이션으로 전환되었습니다. 꽤 멋지 네요.

0

대부분의 경우 이동 경로와 마찬가지로 DB 마이그레이션 자체는 이미 SQL로 작성됩니다.

1

네, 가능 합니다만,이 기능은 이동 경로를 허용하고 싶지 않은 DBA에게는 꼭 필요한 기능입니다.

가 여기에서 코드를 수정 함께 할 만든

, 그것은 당신이 migrationDetails filewriter을 추가하고 밖으로 쓸 수, 이동 경로에 대한 건조 실행 명령의 :

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

내가 지금처럼 한

을 ... 프로젝트 구조 (단지 killbill의 프로젝트에서 그것을 복사하여 이름이 패키지는 flywaydr하기 : Migrator.java에서

. 
./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 

가) DbMigrateWithDryRun.java에서을 (추가 콜백을 구현하고 넣어 :

,536,913를 내가 컴파일 언급

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);} 
    } 

} 

마지막으로 한가지와 (받는다는 통해 (일명 fatjar) "종속성"항아리에 구글 조립 플러그인이 패키지 : 63,210

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

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

는 다음과 같은 파일에 물건을 쓰기 + jar with dependencies)를 실행하고 아래의 명령을 통해 실행하거나 의존성으로 포함시키고 mvn exec:exec 목표를 통해 호출 할 수 있습니다. 이는 내가 성공한 것도 있습니다.

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