🎿

jOOQのコード生成をデータベース接続無しで行う

2021/02/21に公開

やりたいこと

jOOQのコード生成をデータベース接続無しで行いたい。
SQLファイルからコード生成を行う方法があるのでそれを試す。

環境

  • jOOQ: 3.14.7
  • Gradle: 6.7
  • Kotlin: 1.4.21

準備

SQLファイル

任意のディレクトリにSQLファイルを作成する。(今回はsrc/main/resorces/db
SQLファイルの中身はjOOQのサンプルを利用する。
https://www.jooq.org/doc/latest/manual/getting-started/sample-database/

database.sql
CREATE TABLE language
(
    id          number(7) NOT NULL PRIMARY KEY,
    cd          CHAR(2)   NOT NULL,
    description varchar2(50)
);

CREATE TABLE author
(
    id            number(7)    NOT NULL PRIMARY KEY,
    first_name    varchar2(50),
    last_name     varchar2(50) NOT NULL,
    date_of_birth DATE,
    year_of_birth number(7),
    distinguished number(1)
);

CREATE TABLE book
(
    id           number(7)     NOT NULL PRIMARY KEY,
    author_id    number(7)     NOT NULL,
    title        varchar2(400) NOT NULL,
    published_in number(7)     NOT NULL,
    language_id  number(7)     NOT NULL,

    CONSTRAINT fk_book_author FOREIGN KEY (author_id) REFERENCES author (id),
    CONSTRAINT fk_book_language FOREIGN KEY (language_id) REFERENCES language (id)
);

CREATE TABLE book_store
(
    name varchar2(400) NOT NULL UNIQUE
);

CREATE TABLE book_to_book_store
(
    name    varchar2(400) NOT NULL,
    book_id INTEGER       NOT NULL,
    stock   INTEGER,

    PRIMARY KEY (name, book_id),
    CONSTRAINT fk_b2bs_book_store FOREIGN KEY (name) REFERENCES book_store (name) ON DELETE CASCADE,
    CONSTRAINT fk_b2bs_book FOREIGN KEY (book_id) REFERENCES book (id) ON DELETE CASCADE
);

jOOQ

gradle-jooq-pluginを利用する。

https://github.com/etiennestuder/gradle-jooq-plugin

build.gradle を以下のように書き換える。

build.gradle
plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.4.21'
+   id 'nu.studer.jooq' version '5.2'
}

group 'org.example'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib"
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
+   jooqGenerator 'org.jooq:jooq-meta-extensions'
}

test {
    useJUnitPlatform()
}

+jooq {
+    configurations {
+        main {
+            generationTool {
+                logging = org.jooq.meta.jaxb.Logging.WARN
+                generator {
+                    database {
+                        name = 'org.jooq.meta.extensions.ddl.DDLDatabase' // 1
+                        properties {
+                            property {
+                                key = 'scripts'
+                                value = 'src/main/resources/db/**' // 2
+                            }
+                            property {
+                                key = 'sort'
+                                value = 'semantic' // 3
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
  1. SQLファイルを元にコード生成するジェネレータを指定する。
  2. SQLファイルのパスを指定する。
  3. SQLファイルのソート順を指定する。他にalphanumericやflywayソート指定が可能。

コード生成

コード生成は generateJooqタスクで行う。

./gradlew generateJooq

生成されたコードは build/generated-src/jooq に格納される。

さいごに

SQLファイルからコードの生成をすることができた。
データベースはH2のみ対応のようなので、これ以外のデータベースを使っている場合は使えないことがわかった。
(普段はPostgreSQLを使っているので、データベース接続無しでコード生成ができればCI等のビルドを速くできるのではという思惑が外れた🥺)

Discussion