在 Flyway Java API 中使用 SQL 迁移文件

Use an SQL migration file in the Flyway Java API

我不确定这是否可行,但我正在尝试通过 Flyway Java API 以编程方式加载保存在 SQL 文件中的迁移。我有一个 SQL 文件保存在基本 class 路径中(现在为简单起见)作为 V1__Initial_version.sql 和一个简单的 table 创建声明:

CREATE TABLE test_user (
    name VARCHAR(25) NOT NULL, PRIMARY KEY(name)
);

然后在Java程序中我使用

Flyway flyway  = new Flyway();
flyway.setDataSource(jdbc_url, user, password);
int migrations = flyway.migrate();  // Just to check the # of migrations applied

我看到 ClassPathScanner 通过 class 路径查找有效迁移,但它似乎忽略了 sql 迁移文件。当我从命令行调用 flyway migrate 时,相同的 sql 迁移文件工作正常。我创建了一个 java class 并继承自 JdbcMigrations class 并且 ClassPathScanner 很好地选择了它。我需要做什么才能让 Java ClassPathScanner 拾取 .sql 文件并将其用作有效迁移?

大图

也许我一开始就做错了,所以我会添加我正在尝试做的事情。我正在尝试设置一个我可以在测试之间使用、核对和重建的测试数据库。 IE。 TestA 在 table 中输入了一些东西,然后预测试函数将清理数据库并重置它,然后 TestB 将有一个干净的数据库和空的 tables 来执行它的测试。我在预测试函数中使用 flyway.clean() 和 flyway.migrate() 但它会破坏 schema_version table 以及其他所有内容,然后迁移不会从中重建之前的基线。

感谢任何帮助!谢谢!

不确定为什么它不接受您的任何迁移。也许他们需要在特定目录中?您需要检查 src 代码以了解为什么它不选择您的文件进行迁移。

关于大局:

我们通常在 运行 构建和测试用例之前使用 flyway:migrate 迁移测试数据库。我们使用 DBUnit、Spring 测试或类似的单元测试框架,它们允许使用数据预测试数据库设置。该结构在测试期间不应更改,因此不需要数据库迁移。 Arquillian 对于 运行ning 测试之前的数据库初始化也非常有用,请参见此处 https://github.com/arquillian/arquillian-extension-persistence

编辑 1 所以我创建了一个小例子

import org.flywaydb.core.Flyway;
public class TestClass {
public static void main(String args[]) {
    Flyway flyway = new Flyway();
    for (String location : flyway.getLocations()) {
        System.out.println(location);
    }
    flyway.setDataSource("jdbc:h2:~/test", "sa", "");
    System.out.println("Result: " + flyway.migrate());
}
}

将 sql 文件放入 src/main/resources/db/migration 和 运行 中。它可以很好地接收 sql 迁移。如果要将 sql 放在不同的目录中,请使用 setLocations()

<pre>classpath:db/migration Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.util.VersionPrinter printVersion INFO: Flyway 4.0.3 by Boxfuse Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.dbsupport.DbSupportFactory createDbSupport INFO: Database: jdbc:h2:~/test (H2 1.4) Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.command.DbValidate validate INFO: Successfully validated 1 migration (execution time 00:00.009s) Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.command.DbMigrate migrate INFO: Current version of schema "PUBLIC": << Empty Schema >> Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.command.DbMigrate applyMigration INFO: Migrating schema "PUBLIC" to version 1.1 - Initial version Result: 1 Aug 30, 2016 10:48:41 PM org.flywaydb.core.internal.command.DbMigrate logSummary INFO: Successfully applied 1 migration to schema "PUBLIC" (execution time 00:00.024s).</pre>