jOOQ:DDLDatabase 生成器是否对可延迟约束有限制?
jOOQ: Is there a restriction in the DDLDatabase generator for deferrable constraints?
我正在使用 Gradle 中的 DDLDatabase 生成器来生成 jOOQ 源。在可延迟约束方面,我似乎遇到了障碍。
从实时数据库生成相同的 DDL 有效...
这是我对 DDLDatabase 的配置:
jooq {
version = "3.11.11"
edition = "OSS"
reference(sourceSets.main) {
generator {
database {
name = "org.jooq.meta.extensions.ddl.DDLDatabase"
properties {
property {
key = "scripts"
value = "schema-gen/schema.sql"
}
property {
key = "sort"
value = "semantic"
}
}
inputSchema = "REFERENCE"
}
generate {
relations = true
deprecated = false
records = true
immutablePojos = false
fluentSetters = true
}
target {
packageName = "com.octeris.aml.reference.persistence.jooq"
directory = "jooq-gen"
}
}
}
}
这是生成器遇到的 DDL 部分:
create table reference.a (
id varchar(100) not null
,foo_id varchar(100)
,constraint a$c$p primary key (id)
,constraint a$f foreign key (foo_id) references reference.b(id) on delete restrict on update restrict deferrable initially deferred
);
报告的错误如下:
Token ')' expected: [8:106] ...rence.b(id) on delete restrict on update restrict [*]deferrable initially deferred
有谁知道可以接受的替代语法?或者这可能是生成器中的错误?
jOOQ 解析器还不能识别这个语法。我为此创建了一个功能请求:
https://github.com/jOOQ/jOOQ/issues/8799
jOOQ 3.11 解决方法
现在,解决方法是在将 SQL 文件传递给 DDLDatabase
之前对其进行预处理。您应该搜索 deferrable initially deferred
语法并将其替换为空字符串。
jOOQ 3.12 解决方法
请注意,从即将推出的 jOOQ 3.12 开始,将有一个新的 jOOQ-specific 注释语法,您可以在其中仅针对 jOOQ 解析器注释掉此类语法元素,而它们将继续由您的数据库执行。功能请求是这个:
https://github.com/jOOQ/jOOQ/issues/8325
该功能将像这样工作(这是将在数据库中执行的内容):
create table reference.a (
id varchar(100) not null
,foo_id varchar(100)
,constraint a$c$p primary key (id)
,constraint a$f
foreign key (foo_id)
references reference.b(id)
on delete restrict
on update restrict
-- [jooq ignore start]
deferrable initially deferred
-- [jooq ignore stop]
);
jOOQ 将忽略这两个标记之间的所有内容,因此这将是 jOOQ 解析的内容
create table reference.a (
id varchar(100) not null
,foo_id varchar(100)
,constraint a$c$p primary key (id)
,constraint a$f
foreign key (foo_id)
references reference.b(id)
on delete restrict
on update restrict
-- [jooq ignore start]
-- [ ... ignored ... ]
-- [jooq ignore stop]
);
SQL不需要这样格式化。我只是在这里为这个问题做了这个。您也可以在一行 SQL 语句中使用 /* [jooq ignore start] */
。
分隔被 jOOQ 忽略的部分的确切标记可以通过以下方式指定:
Settings.parseIgnoreCommentStart
Settings.parseIgnoreCommentStop
我正在使用 Gradle 中的 DDLDatabase 生成器来生成 jOOQ 源。在可延迟约束方面,我似乎遇到了障碍。
从实时数据库生成相同的 DDL 有效...
这是我对 DDLDatabase 的配置:
jooq {
version = "3.11.11"
edition = "OSS"
reference(sourceSets.main) {
generator {
database {
name = "org.jooq.meta.extensions.ddl.DDLDatabase"
properties {
property {
key = "scripts"
value = "schema-gen/schema.sql"
}
property {
key = "sort"
value = "semantic"
}
}
inputSchema = "REFERENCE"
}
generate {
relations = true
deprecated = false
records = true
immutablePojos = false
fluentSetters = true
}
target {
packageName = "com.octeris.aml.reference.persistence.jooq"
directory = "jooq-gen"
}
}
}
}
这是生成器遇到的 DDL 部分:
create table reference.a (
id varchar(100) not null
,foo_id varchar(100)
,constraint a$c$p primary key (id)
,constraint a$f foreign key (foo_id) references reference.b(id) on delete restrict on update restrict deferrable initially deferred
);
报告的错误如下:
Token ')' expected: [8:106] ...rence.b(id) on delete restrict on update restrict [*]deferrable initially deferred
有谁知道可以接受的替代语法?或者这可能是生成器中的错误?
jOOQ 解析器还不能识别这个语法。我为此创建了一个功能请求: https://github.com/jOOQ/jOOQ/issues/8799
jOOQ 3.11 解决方法
现在,解决方法是在将 SQL 文件传递给 DDLDatabase
之前对其进行预处理。您应该搜索 deferrable initially deferred
语法并将其替换为空字符串。
jOOQ 3.12 解决方法
请注意,从即将推出的 jOOQ 3.12 开始,将有一个新的 jOOQ-specific 注释语法,您可以在其中仅针对 jOOQ 解析器注释掉此类语法元素,而它们将继续由您的数据库执行。功能请求是这个: https://github.com/jOOQ/jOOQ/issues/8325
该功能将像这样工作(这是将在数据库中执行的内容):
create table reference.a (
id varchar(100) not null
,foo_id varchar(100)
,constraint a$c$p primary key (id)
,constraint a$f
foreign key (foo_id)
references reference.b(id)
on delete restrict
on update restrict
-- [jooq ignore start]
deferrable initially deferred
-- [jooq ignore stop]
);
jOOQ 将忽略这两个标记之间的所有内容,因此这将是 jOOQ 解析的内容
create table reference.a (
id varchar(100) not null
,foo_id varchar(100)
,constraint a$c$p primary key (id)
,constraint a$f
foreign key (foo_id)
references reference.b(id)
on delete restrict
on update restrict
-- [jooq ignore start]
-- [ ... ignored ... ]
-- [jooq ignore stop]
);
SQL不需要这样格式化。我只是在这里为这个问题做了这个。您也可以在一行 SQL 语句中使用 /* [jooq ignore start] */
。
分隔被 jOOQ 忽略的部分的确切标记可以通过以下方式指定:
Settings.parseIgnoreCommentStart
Settings.parseIgnoreCommentStop