当前位置: 首页 > 知识库问答 >
问题:

在没有可识别模式的情况下,并不总是执行飞行路线迁移

魏康安
2023-03-14

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

  • a、 b.c.account.persistence.jdbc.migrations.Vaccount_1__CreateStructure。java a.b.c.account.persistence.jdbc.migrations.Vaccount_2__CreateIndexOnName。sql…a.b.c.account.persistence.jdbc.gration.Vaccount___AddDAOCreatedAndUpdated.sql

和 JDBC帐户持久性服务简单与 JDBC帐户持久性服务简单测试。

模块二包含

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

和JDBCAuthenticationPersistenceServiceimplTest。

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

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

如果在干净 db 和已填充 db 上分别启动,则这两个测试都有效。但是,如果我先清理数据库并使用运行 JDBC 身份验证持久性服务测试从智能运行测试,则另一个测试将失败:

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

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

共有1个答案

田兴怀
2023-03-14

这里有三个问题。

  1. 您缺少一个 sql迁移前缀,如Vaccount_
  2. Flyway 对版本过于宽容,应拒绝将帐户作为有效的版本号
  3. 模块可能应具有单独的元数据表
 类似资料:
  • 我们有一个用于填充表的迁移,但是由于我们刚刚开始开发,因此此数据经常更改。因此,我们想知道我们是否可以更新这样的迁移脚本,并要求flyway回滚它(以前的版本)并再次执行它(新版本)。事实上,如果这是可能的,也就是说,如果迁移是可变的,那么我们想象需要回滚并再次执行每个后续迁移,以确保它们没有受到影响。我们认为,这可以避免移徙在发展过程中的扩散。

  • 我们使用Liquibase,现在在新项目中,我们必须使用Flyway。在liquibase中,迁移顺序在xml文件中,所以您可以指定什么是第一次迁移,什么是第二次迁移,它不依赖于名称。 所以,当一些开发人员添加新的迁移时,如果之前有人推动了新的迁移,那么他将在Git中遇到冲突,并且必须修复顺序。 这是如何在Flyway中实现的?如果并行添加迁移,如何控制顺序?

  • 问题内容: 我正在寻找没有浏览器的Javascript编程。我想从Linux或MacOSX命令行运行脚本,就像我们运行任何其他脚本语言(ruby,PHP,Perl,Python …)一样 我研究了spider monkey(Mozilla)和v8(Google),但它们似乎都是嵌入式的。 是否有人将Javascript作为脚本语言从命令行执行? 如果有人好奇,为什么我期待到这一点,我一直在关注着N

  • 在类路径中:/db。迁移有迁移但flyway没有看到这一点,而是爱上了msg 2022-05-02 17:28:07.993INFO 45296 --- [ restartedMain]c. c. c. ConfigServiceProperty tySourceLocator:从服务器获取配置,地址为:http://localhost:8888/story2022-05-02 17:28:08.

  • 我为命令行java迁移执行了以下步骤: < li >创建java文件 当我执行迁移逗号时,它会像 警告:无法解析位置类路径:db/迁移 请查看下面的附件图片,它实际上是罐子。我已经提取了更多信息。

  • 问题内容: 我有一个没有情节提要的应用程序,所有UI创建都是通过代码完成的,我得到了一个我可以使其在iPhone上使用的应用程序,因为该应用程序最初仅是为iPad设计的,因此当您在列表中选择一行时,大师认为,它在iPhone上什么也不做,但在iPad上工作正常。 所以我的问题是我可以创建并执行允许在方法上显示“详细视图”的segue 吗? 到目前为止,这是我所做的: 但是当运行并选择一行时,应用程