【问题标题】:Running dynamically generated flyway scripts in java在java中运行动态生成的flyway脚本
【发布时间】:2019-11-30 21:08:30
【问题描述】:

我想运行一些 flyway 脚本来设置我的数据库以进行集成测试。

我在src/test/resources/db/migration 有一个飞行脚本 V1-XXX,并且在加载应用程序上下文后,我正在同一位置复制另一个文件 V2-XXXX。然后我使用以下代码迁移 2 个脚本。只有第一个脚本正在迁移。有人可以告诉我如何成功迁移这两个脚本吗?

Flyway flyway = Flyway.configure()
                          .dataSource("jdbcUrl",
                                      "username",
                                      "password").load();
flyway.migrate();

我正在使用的flyway版本:

compile "org.flywaydb:flyway-core:5.2.4"

我添加了以下代码来获取待处理的迁移信息:

    flyway.setLocations("filesystem:src/test/resources/db/migration");
    MigrationInfoService migrationInfoService = flyway.info();
    MigrationInfo[] migrationInfos = migrationInfoService.pending();
    flyway.migrate();

我看到以下日志:

2019-07-22 16:07:27.046  INFO 46406 --- [           main] o.f.core.internal.command.DbValidate     : Successfully validated 2 migrations (execution time 00:00.022s)
2019-07-22 16:07:27.057  INFO 46406 --- [           main] o.f.c.i.s.JdbcTableSchemaHistory         : Creating Schema History table: "public"."flyway_schema_history"
2019-07-22 16:07:27.074  INFO 46406 --- [           main] o.f.core.internal.command.DbMigrate      : Current version of schema "public": << Empty Schema >>
2019-07-22 16:07:27.075  INFO 46406 --- [           main] o.f.core.internal.command.DbMigrate      : Migrating schema "public" to version 1.1 - create-pgcrypto
2019-07-22 16:07:27.089  INFO 46406 --- [           main] o.f.core.internal.command.DbMigrate      : Migrating schema "public" to version 20190712113815 - creating-initial-tables
2019-07-22 16:07:27.138  INFO 46406 --- [           main] o.f.core.internal.command.DbMigrate      : Successfully applied 2 migrations to schema "public" (execution time 00:00.082s)
2019-07-22 16:07:28.603  INFO 46406 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.

2019-07-22 16:07:28.625  INFO 46406 --- [           main] o.f.core.internal.command.DbValidate     : Successfully validated 1 migration (execution time 00:00.003s)
2019-07-22 16:07:28.632  INFO 46406 --- [           main] o.f.c.i.s.JdbcTableSchemaHistory         : Creating Schema History table: "public"."flyway_schema_history"
2019-07-22 16:07:28.643  INFO 46406 --- [           main] o.f.core.internal.command.DbMigrate      : Current version of schema "public": << Empty Schema >>
2019-07-22 16:07:28.643  INFO 46406 --- [           main] o.f.core.internal.command.DbMigrate      : Migrating schema "public" to version 1.1 - create-pgcrypto
2019-07-22 16:07:28.656  INFO 46406 --- [           main] o.f.core.internal.command.DbMigrate      : Successfully applied 1 migration to schema "public" (execution time 00:00.024s)

flyway 似乎检测到 2 个脚本,但只迁移了 1 个脚本。

【问题讨论】:

    标签: java postgresql spring-boot flyway


    【解决方案1】:

    您可以使用 Flyway 的设置位置方法 这里:

    flyway.setLocations("filesystem:src/test/resources/db/migration");
    

    【讨论】:

    • Sathvik,感谢您的回答。我添加了您建议的代码,但仍然看到相同的结果。请检查更新后的问题。
    • 嗯,看起来很棘手。检查您是否在代码中两次应用迁移 (flyway.migrate()),因为根据日志,您是。确保在设置位置后申请。我经常陷入的一个陷阱是命名版本文件。我经常忘记在版本号后添加两个下划线作为分隔符。例如,V2__InsertOrAlter.sql 正确 和 V2_InsertOrAlter.sql 不正确。 ref
    【解决方案2】:

    所以我得到了同样的结果。

    我的方法略有不同。我正在创建一个新的数据库(通过 docker),并且正在创建一个新的数据库模式(以编程方式,不使用 flyway)。

    创建数据库后,我运行 flyway.baseline()(按照 flyway 控制台的建议)。事实证明这不是必需的,并在表flyway_schema_history 中留下了一个条目。控制台输出还告诉我当前版本是1,这似乎并没有不合理……但似乎是执行迁移脚本失败的原因V1。

    下面的日志输出很好地证明了这一点,也许您会在自己的日志中看到类似的情况。

    flyway.baseline()
    
    22:00:44.288 [main] INFO org.flywaydb.core.internal.command.DbBaseline - Successfully baselined schema with version: 1
    
    flyway.clean()
    
    22:04:52.821 [main] INFO org.flywaydb.core.internal.command.DbMigrate - Current version of schema `test_db`: << Empty Schema >>
    

    表中的单个条目(未应用 clean() 时)在版本列中具有版本 1。

    我拆除了数据库并从头开始重新启动它,这次我交换了我的 V1 和 V2 文件。这一次,结果发生了逆转。然后我将V1 文件重命名为V3,V2 和现在的V3 文件都按预期应用了。

    最后,在执行迁移之前检查flyway_schema_history version 列中是否还没有使用您的版本号。

    【讨论】:

      猜你喜欢
      • 2016-08-12
      • 2020-08-17
      • 2018-11-11
      • 2015-08-09
      • 2016-06-09
      • 1970-01-01
      • 2017-03-01
      • 2016-04-27
      • 1970-01-01
      相关资源
      最近更新 更多