【问题标题】:How to customize Flyway so that it can handle CSV files as input as well?如何自定义 Flyway 以便它也可以处理 CSV 文件作为输入?
【发布时间】:2017-12-30 21:43:33
【问题描述】:

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

我自己尝试用 Flyway 4.2 来做,但我对 java 不是很好。我已经使用示例创建了自己的 jar 并使其可以访问 flyway。但是flyway如何区分何时使用SqlMigrator以及何时使用我的CsvMigrator?我以为我必须注册自己的前缀/后缀(如上面的问题所写),但 FlywayConfiguration 似乎是只读的,至少我没有看到任何 API 调用这样做:(。

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

【问题讨论】:

  • 这是 Java 问题还是 Python 问题?
  • 我希望能够调用 python(或 shell)文件作为 Flyway 中的迁移步骤,它是用 Java 编写的。 Flyway API 是 java...所以我猜是 Java。

标签: python csv flyway


【解决方案1】:

在流了一些眼泪和鲜血之后,似乎想出了点什么。我无法提供整个代码,因为它使用的是专有文件格式,但主要思想如下:

  • 同时实现 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()。一些提示:
  • 任何异常或错误退出代码都需要转换为 SQLException。
  • 构建执行 Java 1.6,因此无法使用 new 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 问题中发现了这一点。)
  • 我还没有做的是校验和部分,我还不知道它想要什么。

【讨论】:

    猜你喜欢
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多