jOOQ:DDLDatabase生成器中是否存在对可延迟约束的限制?

时间:2019-06-13 15:38:45

标签: sql code-generation ddl jooq

我正在使用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$1 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

有人知道其他可以接受的语法吗?还是这可能是生成器中的错误?

1 个答案:

答案 0 :(得分:0)

jOOQ解析器尚未识别此语法。我为此创建了一个功能请求: https://github.com/jOOQ/jOOQ/issues/8799

jOOQ 3.11解决方法

现在,解决方法是在将SQL文件传递到DDLDatabase之前对其进行预处理。您应该搜索deferrable initially deferred语法并将其替换为空字符串。

jOOQ 3.12解决方法

请注意,从即将发布的jOOQ 3.12开始,将出现新的特定于jOOQ的注释语法,您可以仅在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$1 
    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$1 
    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