Quarkus响应式Testcontainers场景下手动执行Flyway迁移的问题
这个需求完全可以实现,提供两种可行方案:
方案一:使用Quarkus官方Flyway扩展(推荐)
你不需要自己封装Flyway启动逻辑,Quarkus官方Flyway扩展已经兼容Reactive数据源 + Testcontainers(DevServices)的场景,只需要调整配置即可:
- 首先引入
quarkus-flyway依赖 - 修改测试配置的
application.yml,新增Flyway专属JDBC开关:
quarkus: flyway: active: true # 单独为Flyway开启JDBC支持,不受全局数据源JDBC开关影响 jdbc: true datasource: db-kind: postgresql jdbc: false username: password: reactive: url: max-size: 20
配置完成后Quarkus会自动获取Testcontainers生成的数据库连接信息,自动执行Flyway迁移,无需额外编码。
方案二:自定义迁移逻辑时获取动态连接参数
如果你需要自己控制迁移逻辑,只要直接注入Quarkus自动生成的JDBC连接配置即可,Testcontainers启动后会动态覆盖对应配置属性,优先级高于静态配置文件的内容,不会读到main目录下的旧配置:
@ApplicationScoped public class RunFlyway { // 直接注入Quarkus动态生成的JDBC地址,无需手动拼接 @ConfigProperty(name = "quarkus.datasource.jdbc.url") String jdbcUrl; @ConfigProperty(name = "quarkus.datasource.username") String datasourceUsername; @ConfigProperty(name = "quarkus.datasource.password") String datasourcePassword; public void runFlywayMigration(@Observes StartupEvent event) { Flyway flyway = Flyway.configure() .dataSource(jdbcUrl, datasourceUsername, datasourcePassword).load(); flyway.migrate(); } }
注意事项
- 如果自定义迁移类仅在测试环境使用,建议放在
src/test/java目录下,避免打包到生产环境 - 若使用2.3.0.RC1版本遇到属性不生效的问题,可以升级到同系列的稳定版2.3.0.Final修复DevServices的已知小问题
内容的提问来源于stack exchange,提问作者mangusbrother
相关产品推荐
相关产品推荐

