如果没有可识别的模式,则不会始终执行Flyway迁移

时间:2013-01-14 23:12:31

标签: java flyway

我有一个包含两个模块的项目。两个模块都使用flyway进行迁移和初始设置数据库。两个项目都是独立的。我还在每个模块中进行了测试。每当我运行两个模块,或者只从一个模块运行一个测试时,可能无法执行迁移。 第一单元包含

  • a.b.c.account.persistence.jdbc.migrations.Vaccount_1__CreateStructure.java a.b.c.account.persistence.jdbc.migrations.Vaccount_2__CreateIndexOnN​​ame.sql ... a.b.c.account.persistence.jdbc.migrations.Vaccount_5__AddDAOCreatedAndUpdated.sql

和JDBCAccountPersistenceServiceImpl与JDBCAccountPersistenceServiceImplTest。

第二单元包含

  • a.b.c.authentication.persistence.jdbc.migrations.Vauth_1__CreateTableForPasswords.sql a.b.c.authentication.persistence.jdbc.JDBCAuthenticationPersistenceServiceImpl

和JDBCAuthenticationPersistenceServiceImplTest。

两个Impls在其init方法中共享一个父类调用:

//prepare db.
Flyway flyway = new Flyway();
flyway.setDataSource(getDataSource());
flyway.setLocations(getClass().getPackage().getName()+".migrations");
flyway.migrate();

如果在clean db和filled db上单独启动,则两个测试都有效。但是,如果我清理数据库并首先运行JDBCAuthenticationPersistenceServiceImplTest从intellij运行测试,则另一个测试将失败:

org.postgresql.util.PSQLException: ERROR: relation "account" does not exist
  Position: 13
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)

在这种情况下,schema_version只包含一行:

1 |              1 | auth.1  | CreateTableForPasswords | SQL  | Vauth_1__CreateTableForPasswords.sql | -1961897674 | another      | 2013-01-14 23:39:00.736033 |             18 | t

如果我手动删除所有表,测试将再次运行。如果我在干净的db(maven)上从控制台运行测试它也可以。 我究竟做错了什么? 可能是auth.1被认为是比account.1更高的版本,因此不会执行account.1补丁吗?

1 个答案:

答案 0 :(得分:0)

这里有三个问题。

  1. 您缺少像Vaccount _
  2. 这样的sqlMigrationPrefix
  3. Flyway对版本过于宽松,应拒绝account.1作为有效版本号
  4. 模块应该有单独的元数据表