Comments 4
Спасибо! Очень интересная информация!
Я уже лет 5 использую JOOQ, но про gradle-jooq-plugin ничего не знал :) Век живи - век учись. Спасибо большое!
Минусы такого подхода
Каждый билд запускает Docker-контейнер и накатывает миграции(но таски можно закэшировать).
Я, в боевых проектах, для себя немного другую стратегию выбрал. Я генерирую JOOQ DSL только тогда, когда меняется схема. Сгенерированный DSL сохраняю в Git. Для генерации точно так же, как и вы, поднимаю docker образ Postgresql, и с помощью Flyway накатываю схему. Для генерации DSL делаю отдельную Gradle задачу - ./gradlew jooq. Скрипт выглядит примерно так:
import org.jooq.codegen.GenerationTool
import org.jooq.meta.jaxb.*
import org.jooq.meta.jaxb.Configuration
import org.jooq.meta.jaxb.Target
import java.lang.Thread.sleep
buildscript {
repositories {
mavenLocal()
mavenCentral()
}
val postgresqlVersion: String by project
val jooqVersion: String by project
dependencies {
classpath("org.postgresql:postgresql:$postgresqlVersion")
classpath("org.jooq:jooq-codegen:$jooqVersion")
}
}
repositories {
mavenLocal()
mavenCentral()
}
plugins {
kotlin("jvm")
id("com.palantir.docker-run")
id("org.flywaydb.flyway")
}
val kotlinJdkVersion: String by project
kotlin {
jvmToolchain(kotlinJdkVersion.toInt())
}
val flywayMigrationDir = file("${projectDir}/src/main/resources/db/migration")
val jooqOutputDir = file("${projectDir}/src/jooq")
val postgresPort = "35002"
val postgresUrl = "jdbc:postgresql://localhost:$postgresPort/postgres"
val postgresUser = "postgres"
val postgresPassword = ""
val postgresSchema = "dev"
dockerRun {
name = "my_repository"
image = "postgres"
env(mapOf("POSTGRES_HOST_AUTH_METHOD" to "trust"))
ports("$postgresPort:5432")
clean = true
}
flyway {
url = postgresUrl
user = postgresUser
password = postgresPassword
schemas = arrayOf(postgresSchema)
driver = "org.postgresql.Driver"
}
tasks {
dockerRun.configure {
doLast {
sleep(5000)
}
}
flywayMigrate {
dependsOn(dockerRun.name)
}
register("jooq") {
dependsOn(flywayMigrate.name)
finalizedBy(dockerStop.name)
doFirst {
project.delete(jooqOutputDir)
GenerationTool.generate(
Configuration()
.withJdbc(
Jdbc()
.withDriver("org.postgresql.Driver")
.withUrl(postgresUrl)
.withUser(postgresUser)
.withPassword(postgresPassword)
)
.withGenerator(
Generator()
.withDatabase(
Database()
.withName("org.jooq.meta.postgres.PostgresDatabase")
.withInputSchema(postgresSchema)
.withExcludes("flyway_schema_history")
)
.withTarget(
Target()
.withPackageName("my.project.jooq")
.withDirectory(jooqOutputDir.path)
)
)
)
}
}
}
sourceSets {
main {
java {
srcDir(jooqOutputDir)
}
}
}Sign up to leave a comment.
Что такое JOOQ и как его едят на примере Kotlin + Gradle + JOOQ