【问题标题】:Flyway output to SQL FileFlyway 输出到 SQL 文件
【发布时间】:2011-10-29 19:59:55
【问题描述】:

是否可以将db迁移输出到SQL文件而不是直接调用flyway中的数据库更改?

【问题讨论】:

  • 你能告诉我更多关于你的用例的信息吗?这是 Java 迁移需要的东西吗?或者你想用占位符替换你的输入 sql?
  • 我假设对于生产数据库我将无法通过 jdbc 自己更新数据库,但将脚本发送给某个数据库团队。

标签: flyway


【解决方案1】:

大多数情况下不需要这,因为 Flyway 数据库迁移本身已经用 SQL 编写。

【讨论】:

    【解决方案2】:

    是的,这是可能的,就我而言,该功能对于不想在 prod 中允许 flyway 的 DBA 来说是绝对必须的。

    我从这里修改了代码,这是flyway的空运行命令,你可以添加一个文件写入器并写出migrationDetails:

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

    我是这样做的……项目结构(只是从killbill的项目中复制出来,并将包重命名为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);}
        }
    
    }
    

    最后要提一提的是,我通过 maven(谷歌程序集插件 + 带有依赖项的 jar)将它编译并打包到一个“带有依赖项”(又名 fatjar)的 jar 中,并通过如下命令运行它,或者您可以将其包含为依赖并通过mvn exec:exec 目标调用它,这也是我成功的方法。

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

    【讨论】:

      【解决方案3】:

      我没有找到方法。改用mybatis迁移。看起来很不错。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多