java - Flyway 迁移并不总是在没有可识别模式的情况下执行

标签 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

以及带有 JDBCAccountPersistenceServiceImplTest 的 JDBCAccountPersistenceServiceImpl。

模块二包含

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

和 JDBCAuthenticationPersistenceServiceImplTest。

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

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

如果在干净的数据库和填充的数据库上分别启动,这两个测试都会起作用。但是,如果我清理数据库并从 intellij 运行测试并首先运行 JDBCAuthenticationPersistenceServiceImplTest,则其他测试将失败:

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

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

最佳答案

这里有三个问题。

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

关于java - Flyway 迁移并不总是在没有可识别模式的情况下执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14328537/

相关文章:

java - 双引号转义Java

java - Android Java - SoundPool 声音由于某种原因停止播放

sql - Flyway迁移不适用于gradle

flyway - CentOS如何安装flyway数据库迁移工具?

flyway - Flyway 基线功能有何用处?

javap 以可编程的方式

java - 如何在spring boot中注册ServletContextListener

java - FlyWay 版本

Flyway 迁移被 null version_rank 阻止

java - 在我的对象内传递用户定义的参数时遇到问题