🎿
jOOQのコード生成をデータベース接続無しで行う
やりたいこと
jOOQのコード生成をデータベース接続無しで行いたい。
SQLファイルからコード生成を行う方法があるのでそれを試す。
環境
- jOOQ: 3.14.7
- Gradle: 6.7
- Kotlin: 1.4.21
準備
SQLファイル
任意のディレクトリにSQLファイルを作成する。(今回はsrc/main/resorces/db
)
SQLファイルの中身はjOOQのサンプルを利用する。
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を利用する。
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
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
- SQLファイルを元にコード生成するジェネレータを指定する。
- SQLファイルのパスを指定する。
- SQLファイルのソート順を指定する。他にalphanumericやflywayソート指定が可能。
コード生成
コード生成は generateJooq
タスクで行う。
./gradlew generateJooq
生成されたコードは build/generated-src/jooq
に格納される。
さいごに
SQLファイルからコードの生成をすることができた。
データベースはH2のみ対応のようなので、これ以外のデータベースを使っている場合は使えないことがわかった。
(普段はPostgreSQLを使っているので、データベース接続無しでコード生成ができればCI等のビルドを速くできるのではという思惑が外れた🥺)
Discussion