繁体   English   中英

在java中运行动态生成的flyway脚本

[英]Running dynamically generated flyway scripts in java

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

我在src/test/resources/db/migration有一个 Flyway 脚本 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 个脚本。

您可以在此处使用 Flyway 的设置位置方法:

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

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

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

创建数据库后,我运行了flyway.baseline() (按照flyway.baseline()控制台的建议)。 事实证明这是不必要的,并在表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() 时)在 version 列中具有 version 1

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

最后,在执行迁移之前,检查flyway_schema_history version列是否已经使用了您的版本号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM