如何自定义Flyway以便它可以处理CSV文件作为输入?

时间:2017-07-25 06:15:25

标签: python csv flyway

是否有人为Flyway实施了CSV处理?前一段时间(Flyway specific migration with csv files)请求了。 Flyway现在将其视为MigrationResolver和MigrationExecutor的可能性,但它似乎没有实现。

我已经尝试过自己使用Flyway 4.2,但我对java并不是很好。我使用样本制作了自己的罐子,然后让它可以进入飞路。但是flyway如何区分何时使用SqlMigrator以及何时使用我的CsvMigrator?我以为我必须注册我自己的前缀/后缀(如上面的问题所写),但FlywayConfiguration似乎是只读的,至少我没有看到任何API调用这样做:(。

如何将不同的解析器连接到不同的迁移文件类型? (.sql使用Sql和.csv / .py进行迁移,以加载Csv并执行python脚本)

1 个答案:

答案 0 :(得分:0)

经过一些流泪和流血之后,看起来似乎想出了一些东西。我不能使整个代码可用,因为它使用的是专有文件格式,但这里有主要的想法:

  • 也实现了ConfigurationAware,并使用setFlywayConfiguration实现来编目您想要处理的额外文件(即.csv)。这只在运行期间执行一次。
  • 在这个编目期间我无法使用扫描程序或LoadableResources,有一些我不懂的Java魔法。即使使用.getMethods()运行时,所有类和方法似乎都可用且可访问...但是当在运行期间尝试实际调用它时,它会抛出java.lang.NoSuchMethodError和java.lang.NoClassDefFoundError。我浪费了一整天的时间 - 不要这样做,只需从org.flywaydb.core.internal.util.scanner.filesystem.FileSystemScanner复制粘贴代码。
  • 使用Set<字符串>而不是LoadableResources [],更容易使用,特别是因为无论如何都无法访问LoadableResources并且使用[]是一场噩梦。
  • python / shell调用将转到execute()。一些提示:
  • 任何异常或fawlty exitcode都需要转换为SQLException。
  • 构建是强制执行Java 1.6,因此不能使用新的ProcessBuilder(cmd).inheritIO()。看看这些解决方案:ProcessBuilder: Forwarding stdout and stderr of started processes without blocking the main thread如果要打印STDOUT / STDERR。
  • 编译包含你的自定义模块的flyway,从git克隆整个flyway repo,编辑主pom.xml以包含你的模块并使用这个命令编译:“mvn install -P-CommercialDBTest -P-CommandlinePlatformAssemblies - DskipTests = true“(我在另一个stackoverflow问题中发现了这个。)
  • 我还没有完成的是校验和部分,我还不知道它想要什么。