Pull to refresh

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)
        }
    }
}

Тоже хорошее решение, самое главное, чтобы после добавления миграций не забывали делать таску JOOQ, иначе плохо кончится)

Sign up to leave a comment.

Articles