在 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>
我不确定这是否可行,但我正在尝试通过 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>