如何在SBT项目中结合Testcontainers与Flyway运行jOOQ?
SBT项目自动管理PostgreSQL容器+Flyway迁移+jOOQ代码生成方案
1. 配置SBT插件与依赖
首先在project/plugins.sbt中添加所需插件:
addSbtPlugin("org.flywaydb" % "flyway-sbt" % "9.22.3") addSbtPlugin("org.jooq" % "jooq-codegen-sbt" % "3.18.6")
然后在build.sbt中添加依赖:
libraryDependencies ++= Seq( "org.testcontainers" % "postgresql" % "1.19.3", "org.postgresql" % "postgresql" % "42.6.0" )
2. 自定义任务实现全流程
在build.sbt中定义整合所有步骤的任务,用Testcontainers管理容器,结合Flyway和jOOQ的API完成完整流程:
import org.testcontainers.containers.PostgreSQLContainer import org.flywaydb.core.Flyway import org.jooq.codegen.GenerationTool import org.jooq.meta.jaxb._ // 自定义任务:启动容器→Flyway迁移→生成jOOQ代码→销毁容器 val generateJooqWithContainer = taskKey[Unit]("自动完成PostgreSQL容器启动、Flyway迁移、jOOQ代码生成及容器清理") generateJooqWithContainer := { // 初始化PostgreSQL容器,指定镜像版本 val postgresContainer = new PostgreSQLContainer("postgres:15-alpine") .withDatabaseName("app_db") .withUsername("dev_user") .withPassword("dev_pass") try { // 启动容器 postgresContainer.start() println(s"PostgreSQL容器启动完成,JDBC URL: ${postgresContainer.getJdbcUrl()}") // 执行Flyway迁移 val flyway = Flyway.configure() .dataSource( postgresContainer.getJdbcUrl(), postgresContainer.getUsername(), postgresContainer.getPassword() ) .locations("filesystem:src/main/resources/db/migration") // 你的Flyway脚本路径 .load() flyway.migrate() println("Flyway迁移执行完成") // 配置并执行jOOQ代码生成 val jooqConfig = new Configuration() .withJdbc(new Jdbc() .withUrl(postgresContainer.getJdbcUrl()) .withUser(postgresContainer.getUsername()) .withPassword(postgresContainer.getPassword()) .withDriver("org.postgresql.Driver") ) .withGenerator(new Generator() .withDatabase(new Database() .withName("org.jooq.meta.postgres.PostgresDatabase") .withInputSchema("public") ) .withTarget(new Target() .withPackageName("com.yourcompany.app.jooq") // 生成代码的包路径 .withDirectory("src/main/scala") // 生成代码的输出目录 ) ) GenerationTool.generate(jooqConfig) println("jOOQ代码生成完成") } finally { // 强制停止并销毁容器,避免残留 postgresContainer.stop() println("PostgreSQL容器已销毁") } }
3. 执行任务
在项目根目录的终端中运行以下命令,即可触发整个流程:
sbt generateJooqWithContainer
关键注意事项
- 本地必须安装Docker,Testcontainers依赖Docker运行容器。
- 调整
locations("filesystem:...")为你项目中Flyway迁移脚本的实际路径。 - 修改jOOQ配置中的
packageName和directory为你的项目代码结构对应的路径。 - 可以根据需求调整PostgreSQL镜像版本、数据库名称、账号密码等参数。
内容的提问来源于stack exchange,提问作者H4uZ
相关产品推荐
相关产品推荐

