[英]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
。
我拆除了数据库并从头开始重新启动它,这次我交换了我的V1
和V2
文件。 这一次结果反过来了。 然后我将我的V1
文件重命名为V3
并且V2
和现在的V3
文件都按预期应用。
最后,在执行迁移之前,检查flyway_schema_history
version
列是否已经使用了您的版本号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.