2016-08-30 70 views
1

我不确定这是否可行,但我试图通过Flyway Java API以编程方式加载保存在SQL文件中的迁移。我(现在为简单起见)保存在基类路径V1__Initial_version.sql一个简单表的创建语句中的SQL文件:在Flyway Java API中使用SQL迁移文件

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通过类路径查看有效的迁移,但似乎忽略了sql迁移文件。当我从命令行呼叫flyway migrate时,同样的sql迁移文件可以正常工作。我创建了一个java类,并从JdbcMigrations类继承而来,ClassPathScanner选择了它。我需要做些什么才能获得Java ClassPathScanner拾取的.sql文件并将其用作有效的迁移?

大局观

也许我错误地要对这个摆在首位,所以我会添加什么,我试图做的。我试图建立一个测试数据库,我可以使用,核武器,并在测试之间重建。 I.E. TestA在表中输入一些东西,预测试函数会清理数据库并重置它,然后TestB将拥有一个干净的数据库和空表来执行它的测试。我在预测试函数中使用了flyway.clean()和flyway.migrate(),但它会破坏schema_version表以及其他所有内容,然后迁移不会从之前的基线重建。

任何帮助表示赞赏!谢谢!

+0

我真的不明白的点的摧毁架构。数据,是的,但架构?我会使用DbSetup(http://dbsetup.ninja-squad.com/)。免责声明:我是作者。 –

+0

你说的没错,实际上没有任何意义去强化模式。我试图做的是清除数据,但使用** flyway.clear **也删除我的模式表。我没有看到另一种方式让flyway清除数据,但保留表格和模式。 –

+2

这不是Flyway的目的。 Flyway的工作是进行图式演变。 –

回答

3

不知道为什么它没有选择你的任何迁移。也许他们需要在特定的目录中?你需要检查src代码,看看它为什么不选择你的文件进行迁移。

关于大局观:

我们通常使用的飞行路线迁移测试数据库:迁移,我们运行构建和测试案例之前。我们使用DBUnit,Spring测试或类似的单元测试框架,这些框架允许使用数据进行预测试数据库设置。测试过程中结构不应该改变,因此不需要数据库迁移。的Arquillian可以为DB初始化非常有用的运行测试,以及前,看到这里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()

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).

+0

我已经将sql迁移文件放置在与java类迁移相同的位置,它位于flyway查找的类路径中.Java类没有被拾取,而是sql文件没有。 –

+1

您将使用我提到的db单元测试框架之一。清除数据库可以是一个简单的SQL,它禁用所有约束并截断所有表。使用flyway为每个测试构建数据库模式不会很好地扩展,特别是一旦您有更多的数据库迁移和更多的测试。 – Guenther

+0

谢谢,这与JB Nizet在评论中给出的建议类似,并且清除了部分问题。我仍然想从sql而不是java JdbcMigration类中进行基本迁移。 –