You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:00:36